用户工具

站点工具


go:composite
  • 复合数据类型
数组:由同构元素组成,固定内存大小;数组的长度是固定的,通常使用slice切片
结构体:由异构元素组成,固定内存大小
slice、map:动态数据结构,内存动态增长
  • 数组:传参时会被复制,可以使用指针
var a [3]int;  //a[0],a[len(a)-1],默认使用对应类型的零值初始化,var a = [...]int{1, 2, 3},编译时需要确定数组长度
for i, v := range a {}   //不关心序号时:for _,v := range a { fmt.Printf("%d\n", v) }
r := [...]int{99: -1}  //100个元素的数组,最后一个元素-1,其它为0。相同数组类型可以直接比较==,元素类型和长度相同
func zero(ptr *[32]byte) { *ptr = [32]byte{} },数组清零:for i := range ptr { ptr[i]=0 }
type Currency int   //定义枚举
const ( USD Currency = iota; EUR; GBP; RMB }
symbol := [...]string{USD: "$", EUR: "€", GBP: "£", RMB: "¥"}  //命名数组
  • slice:[]T,没有固定长度,len长度,cap容量,不可比较
months := [...]string{1: "January", /* ... */, 12: "December"}  //索引0自动初始化为空串,多个slice可以共享底层数组
切片:s[i:j],0<=i<=j<=cap(s),省略i则置0,省略j则置len(s),months[:]引用整个数组,Q2=months[4:7],summer=months[6:9]
nil值:var s []int,s=nil,s=[]int(nil) //s==nil;[]int{} != nil,都有:len(s)==0,make([]T, len, cap)
append追加:var runes []rune; for _, r := range "Hello, 丐界" { runes = append(runes, r) } //等价于[]rune("Hello, 丐界")
  • map[k]v
ages := make(map[string]int)  //空map,等价于:map[string]int{}
ages["alice"] = 31  //可以先make再设值,也可以直接初始化ages := map[string]int{ "alice": 31 }
delete(ages, "alice")  //删除键值对;ages["bob"] = ages["bob"] + 1,查找失败会返回0值,ages["bob"]++;
if age, ok := ages["bob"]; !ok { /* ... */ }  //!ok表示没有bob键值对,可区分已存在的0或不存在时返回0值
names := make([]string, 0, len(ages));   //已知map大小,所有分配固定大小的slice
for name, age := range ages { names = append(names, name) }  //遍历map,随机顺序,每次都可能不同
sort.Strings(names); for _, name := range names { fmt.Printf("%s\t%d\n", name, ages[name]) }  //顺序遍历
  • struct
type Employee struct { ID int; Name string; Birth time.Time }
var dilbert Employee; dilbert.Name = "John";
dilbert := Employee{ Name:"John" };  ptr := &Employee{ Name:"John" }  //其他字段取零值,通常参数传指针
go/composite.txt · 最后更改: 2018/09/05 14:30 由 admin