Go 语言中 = 和 := 有什么区别
使用 = 前必须先用var声明
var a
a = 100
//或
var b = 100
//或
var c int = 100
:= 是声明并赋值,并且系统自动推断类型,不需要var关键字
d := 100
range函数
range函数可以用来遍历数组,切片,通道或者Map。
用于遍历数组、切片时,返回索引和元素;用于遍历Map时,返回键和值;用于遍历通道,只有一个返回值。各种类型的返回值参考下表:
// range函数使示例
package main
import ("fmt"
)
func main() {
fmt.Println("----切片迭代----")
nums := []int{1,2,3,4,5,6}for k , v := range nums {
fmt.Printf("key : %v value : %v \n",k,v)}
fmt.Println("----map迭代----")
kvs := map[string]string{"name": "zhangsan","sex": "男",}for mk , mv := range kvs {
fmt.Printf("mk : %v mv : %v \n",mk,mv)}
fmt.Println("----字符串迭代----")for sk, sv := range "hello world!" {//注意这里单个字符输出的是ASCII码,//用 %c 代表输出字符
fmt.Printf("sk : %v sv : %c \n",sk,sv)}
fmt.Println("----channel迭代----")
ch := make(chan int, 10)
ch <- 11
ch <- 12
close(ch) // 不用的时候记得关掉,不关掉又没有另一个goroutine存在会死锁
for x := range ch {
fmt.Println(x)}
}
//结果
----切片迭代----
key : 0 value : 1
key : 1 value : 2
key : 2 value : 3
key : 3 value : 4
key : 4 value : 5
key : 5 value : 6
----map迭代----
mk : name mv : zhangsan
mk : sex mv : 男
----字符串迭代----
sk : 0 sv : h
sk : 1 sv : e
sk : 2 sv : l
sk : 3 sv : l
sk : 4 sv : o
sk : 5 sv :
sk : 6 sv : w
sk : 7 sv : o
sk : 8 sv : r
sk : 9 sv : l
sk : 10 sv : d
sk : 11 sv : !
----channel迭代----
11
12
切片(slice)
概念
切片是一个引用类型,可以创建”字符串”切片,可以创建”整型”切片等
切片和数组的区别( 重点)
- 切片和数组相似,它们都是保存相同数据类型元素的容器,但是切片的元素个数是可变的, 数组不可变
- 切片不需要明确指定元素的个数
创建切片方法
var i []int //创建int类型切片
var s []string //创建string类型切片
切片的内部实现
切片是一个很小的对象,它对底层的数组(内部是通过数组保存数据的)进行了抽象,并提供相关的操作方法;切片是有三个字段的数据结构,这3个字段分别是: 指向底层数组的指针、切片访问的元素的个数(即长度)、切片允许增长到的元素个数
字符串类型切片 和 字符串类型数组对比
//创建 "字符串"类型的切片
myStr2 := []string{"zhangsan", "list", "wangwu"}
fmt.Println(myStr2)
fmt.Printf("%T \n",myStr2)
//结果:
[zhangsan list wangwu] #字符串类型切片打印的结果
[]string #字符串类型的切片
---------------------------------------------------------
//创建"字符串"类型的数组
myStr3 := [3]string{"zhangsan","lisi","wangwu"}
fmt.Println(myStr3)
fmt.Printf("%T",myStr3)
//结果:
[zhangsan lisi wangwu]
[3]string #字符串类型的数组