七、数组和切片
数组:类型相同的元素集合,Go不允许数组中混合使用不同类型的元素。
声明:
1.var a[3]int a[0]=1 a[1]=2 a[2]=3 //声明一个长度为3的int型数组,并依次复制,不赋值默认值为0
2.a:=[3]int{1,2,3} //速记声明方式
3.a:=[…]int{1,2,3} //用…忽略数组长度,编译器自动推导
#数组是值类型,当数组变量被赋值时,获得原数组的拷贝,新数组改变不会影响原数组,同样作为参数传递给函数时,函数获得数组的拷贝。
#用len()获取数组长度
#用for range遍历数组,range返回数组的索引和对应的值
#多维数组就是将一维数组的值变成一个新的数组,同样的可以创建三维四维数组
切片:切片是对数组的抽象,解决了数组长度不可变的问题,切片更灵活方便。
声明:
1.var slicel []type //未指定大小的数组就是一个切片
2.var slicel []type=make([]type,len) //slicel:=make([]type,len) make函数用来给切片开辟空间,参数一是切片类型,参数二是长度,参数三是切片容量
初始化切片:
1.s:=[]int{1,2,3} //直接初始化
2.s:=arr[:] //对arr的全引用
3.s:=arr[start:end] //将arr中从下标start到end-1的元素引用
4.s:=arr[start:] //从start下标到最后一个
5.s:=arr[:end] //从第一个到end-1下标
修改切片:
1.追加元素:s =append(s []T,x1,x2,x3…)
2.追加切片:s=append(s,t…)
3.删除切片:s=append(s[:i],s[i+1:]) //相当于截取
八、Map
Map:Go中的内置类型,将键与值绑定到一起,通过键获取对应的值。
创建:m:=make(map[KeyType]ValueType) //如m:=make(map[string]int),键是string,值是int型
#map的0值为nil,试图给一个nil map添加元素会报错,因此map必须通过make初始化
#map插入元素与数组相似
/* M:=make(map[string]int)
M[“one”]=1
M[“two”]=2
*/
#访问map与法为:map[key],如果一个键不存在返回0
#检验一个键是否存在map中,用value,ok:=map[key],如果OK是true,则存在,value被赋予对应的值
#range用于遍历map中的所有元素,map是无序的,所以每次遍历顺序不一定一致。
#delete(map, key)用于删除map中的key
#用len获取map大小
#map是引用类型
#比较两个map不能用==,只能依次比较里面的元素是否相等
九、变参函数
变参函数:可以接受可变数量的参数的函数,如果最后一个参数由…T表示,则表示该函数可以接受任意数量的T类型参数。只有最后一个参数才能指定为可变参数。
创建一个变参函数:func find(num int,nums …int){ }
十、字符串
在Go中字符串是byte数组,用””来创建字符串。
#一个英文字符占一个字节(8位),一个汉字占三个字节(24位)
#rune表示一个unicode码点,用rune可以原样打印出字符串不会出现乱码
#utf8包提供func RuneCountInString(s string)(n int)来获取字符串的长度,返回rune的数量,即unicode码数量,len返回的是byte的个数,这是两者的区别
#字符串在Go中是不可变的,一旦创建无法改变,要改变字符串需要将其转换为rune切片,修改切片的内容,再将切片转为字符串
十一、指针
指针:存储内存地址的变量叫指针变量。
声明方法:var var_name *var_type
#取址符为&,与之相反的是*,表示解引用,读取指针指向内存地址的内容。
#指针的空值为nil,里面没有指向任何地址,不同于野指针,野指针指向的是未知内存。
#Go不支持指针运算
#虽然可以通过将数组的指针作为参数传给函数,但是一般通过切片来完成,切片相对数组更灵活。
#二级指针,指向指针的指针,var ptr **int为指向一个指向整型指针的指针,访问二级指针需要两个*号。
十二、结构体
结构体:用户自定义的类型,表示若干字段的集合。
声明一个结构体:
Type Employee struct{
name string
age int
}
实例化的三种方式:
1. var emp1 Employee
emp1.name=“zhangsan”
emp1.age=10
2. emp2:=Employee{
name:”zhangsan”
age:20
}
3. emp3:=Employee{“zhangsan”,30}
#当定义一个结构体变量没有赋予初始值时,则为各类型的0值
#访问结构体中的某个字段用.操作,如emp1.name
#结构体指针,可以指向结构体的指针
emp8:=&Employee{“张三”,”20}
emp8是一个指向结构体的指针,访问结构体字段可以用*emp8.name,也可以用emp8.name代替。
#结构体可以只定义类型而不指定字段名字,这种字段叫匿名字段
Type person struct{
String
Int
}
虽然没有字段名字,但是匿名字段的默认名字为类型名,即上面的结构体有string和int两个字段
#结构体的字段是结构体,这种结构体叫嵌套结构体。
Type Person struct{
name string
age int
address Address
}
Type Address struct{
city,state string
}
#字段提阶:如果结构体中的匿名字段也是一个结构体,那么这个匿名结构体字段成为提阶字段,可以从外部结构体直接访问匿名结构体的字段。
type Person struct{
name string
age int
Address
}
提阶字段city和state可以通过p.city和c.state访问
#如果结构体的名称大写字母开头,则在其他包可以访问,同样的,如果字段大写字母开头 ,也可以被其他包访问。
#结构体是值类型。如果字段可以比较,则结构体可以比较,所有的非空字段相等则认为两个结构体变量相等。如果包含一个不可比较类型的字段,则不可比较。
原文:https://www.cnblogs.com/lengshan023/p/11075437.html