基础的数据类型:
布尔类型:bool
整型:int8、uint8(byte)、int16、int(平台相关)、uint(平台相关)、uintptr(同指针,32位平台为4字节,64位平台为8字节)
浮点类型:float32、float64
复数类型:complex64、complex128
字符串:string
字符类型:rune
错误类型:error
复合类型:
指针(pointer)
数组(array)
切片(slice)
字典(map)
通道(chan)
结构体(struct)
接口(interface)
Go 语言在声明变量时,自动对变量对应的内存区域进行初始化操作。每个变量会初始化其类型的默认值,例如:
整型和浮点型变量的默认值为 0。
字符串变量的默认值为空字符串。
布尔型变量默认为 bool。
切片、函数、指针变量的默认为 nil。
一、布尔类型
var v1 bool
v1 = true
布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换。
二、字符类型
var str string str = "Hello world"
三、数组类型
声明变量及初始化第一种:
var team [3]string team[0] = "hammer" team[1] = "soldier" team[2] = "mum"
声明变量及初始化第二种:
var a [5] int = [5]int{1,2,3,4,5} var a = [5]int{1,2,3,4,5} var a = [5]int{1,2,3} var a = [...]int{1,2,3,4,5} var a = [5]string{1:'abc',4:'efg'}
四、切片
切片借助数组的创建:
var a [5]int var b []int = a[0:1] var b []int= []int{1,2,3,4,5}
直接创建:
a := make([]int,5)//初始元素个数为5的数组切片,元素初始值为0
a := make([]int,5,10)//初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间
len(a):数组切片中当前存储的元素个数。
cap(a):返回的是数组切片分配的内存空间。
切片没有删除功能。
向切片数组中追加值:
第一种:
a := make([]int,5)//初始元素个数为5的数组切片,元素初始值为0
a = append(a, 1,2,3)
第二种:
a := []int{1,2,3}
b = append(b,a...)
切片的拷贝:
slice1 := []int{1,2,3,4,5} slice2 := []int{3,4,5} copy(slice2,slice1) //只会复制slice1的前3个元素到slice2中 copy(slice1,slice2) //只会复制slice2的前3个元素到slice1中的前3个位置
切片的排序:
sort.Strings(slice1)
sort.Ints(slice1)
五、map
map的创建和初始化第一种:
var a map[string]string = map[string]string{"hello":"world"}
map的创建和初始化第二种:
a := make(map[string]string, 10) a["hello"] = "world"
相关操作:
val, ok:= a["hello"] //查找 for k, v := range a { //遍历 fmt.Println(k,v) } delete(a, "hello") //删除 len(a) //长度
sync.Map有以下特性:
- 无须初始化,直接声明即可。
- sync.Map 不能使用 map 的方式进行取值和设置等操作,而是使用 sync.Map 的方法进行调用。Store 表示存储,Load 表示获取,Delete 表示删除。
- 使用 Range 配合一个回调函数进行遍历操作,通过回调函数返回内部遍历出来的值。Range 参数中的回调函数的返回值功能是:需要继续迭代遍历时,返回 true;终止迭代遍历时,返回 false。
var scene sync.Map // 将键值对保存到sync.Map scene.Store("greece", 97) scene.Store("london", 100) scene.Store("egypt", 200) // 从sync.Map中根据键取值 fmt.Println(scene.Load("london")) // 根据键删除对应的键值对 scene.Delete("london") // 遍历所有sync.Map中的键值对 scene.Range(func(k, v interface{}) bool { fmt.Println("iterate:", k, v) return true })
六、 列表 list
在 Go 语言中,将列表使用 container/list 包来实现,内部的实现原理是双链表。列表能够高效地进行任意位置的元素插入和删除操作。
列表与切片和 map 不同的是,列表并没有具体元素类型的限制。
列表的初始化一:
lis := list.New()
列表的初始化二:
var lis list.List
列表的相关操作:
双链表支持从队列前方或后方插入元素,分别对应的方法是 PushFront 和 PushBack。
提示
这两个方法都会返回一个 *list.Element 结构。如果在以后的使用中需要删除插入的元素,则只能通过 *list.Element 配合 Remove() 方法进行删除,这种方法可以让删除更加效率化,也是双链表特性之一。
lis := list.New() // 尾部添加 lis.PushBack("canon") // 头部添加 lis.PushFront(67) // 尾部添加后保存元素句柄 element := lis.PushBack("fist") // 在fist之后添加high lis.InsertAfter("high", element) // 在fist之前添加noon lis.InsertBefore("noon", element) // 删除 lis.Remove(element)