数据类型
指针:
指针是一个用来专门存储内存地址的整型变量。
内存地址是内存总某个字节单元的唯一编号,指针是一个实体,有自己的内存空间,空间内存储一个内存地址。
* 对指针取值
& 对变量取地址
数组:
数组是一个定长的数据集合。(可以利用interface存放不同类型的值)
数组是值类型,元素是值传递。
元素类型相同,但长度不同的数组不属于同一类型,不能进行赋值操作。
func main() {
var a = [3]int{} // 无元素自动初始化为默认值0
b := [4]int{0, 1} // 未初始化的元素自动初始化为默认值0
c := [4]int{0, 1: 2, 3: 5} // 指定索引位置初始化
d := [...]int{1, 2, 3} // 根据初始化值的数量确认数组长度
e := [...]int{0, 1, 2, 4: 44, 4, 5, 6, 10: 99} // 自动推导长度也支持指定索引的出世后
fmt.Println(a) // [0 0 0]
fmt.Println(b) // [0 1 0 0]
fmt.Println(c) // [0 2 0 5]
fmt.Println(d) // [1 2 3]
fmt.Println(e) // [0 1 2 0 44 4 5 6 0 0 99]
}
切片:
切片的本质是一个结构体
type Slice struct{ Data unsafe.Pointer // go语言中的万能指针类型。(c语言是void*)没有具体数据类型,不能进行运算。 Len int // 数据元素的个数 Cap int // 可扩展的有效容量 }
切片是一个不定长的数据集合。(可以利用interface存放不同类型的值)
切片是引用类型:元素是引用传递。
定义切片必须make,或者设置元素。
可以是用apend追加,容量会自动扩张(1024下*2,之后1/4)
apend:向切片尾部添加数据,返回新切片
copy:将参数2切片拷贝到参数1切片(可以通过截取设置要,参数2切片的长度和参数1切片的起始位置)返回值是改变的元素个数(也就是第二个参数的长度)
不能对内容为空的切片进行写操作,但是能读
内容为空和nil是不同的
copy是值传递。
func copySlice() {
s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := s[5:9] // 5 6 7 8
n := copy(s[4:], s1) // s: [0,1,2,3,5,6,7,8,8,9]
fmt.Println(n, s, s1) // 4 [0 1 2 3 5 6 7 8 8 9] [6 7 8 8]
s2 := make([]int, 6)
n = copy(s2, s)
fmt.Println(n, s2) // 6 [0 1 2 3 5 6]
}
map:
无需的键值对集合,key必须是支持==和!=比较的数据类型。
访问不存在的值时返回0值,不会引发错误。
可以使用ok-idiom模式判断键是否存在。
map是无序的。
要修改map的值,只需要重新赋值即可
如果map的key是结构体,不能通过m[“a”].age +=1 来改变字段值
如果需要修改字段值,只能修改整个value
和切片一样,不能对内容为空的字典进行写操作,但是能读
内容为空和nil是不同的
map的key和value都可以使用interface来实现设置不同的类型
v,ok := m["a"]
// 两种初始化
m:=make(map[string]int)
m:=map[string]int{
"a"=1,
"b"=2,
}
结构体:
结构体是将多个不同类型命名字段序列打包成一个复合类型。
只有在所有字段类型全部支持时相等操作时,才可以进行比较。只支持!=和==。
字段后可以用``设置字段标签,字段标签不是注释,可以用来对字段进行描述,常被用做格式校验,数据库关系映射等。
带标签的字段通常是导出字段,否则标签也无法使用。
type user10 struct {
name string
p person10
student10
}
type person10 struct {
age int
}
type student10 struct {
Address string `orm:"size(20)"`
}
func main() {
u := user10{}
u.name = "name"
fmt.Println(u) // {name {0} {}}
u.student10.Address = "地址"
fmt.Println(u) // {name {0} {地址}}
u.Address = "短地址"
fmt.Println(u) // {name {0} {短地址}}
}