Go 笔记之数据类型
go 笔记系列,旨在简明扼要地概述学习的关键点,以便他日查证拾遗
-
工作区结构
- src pkg bin
- main.main() 函数(这个函数位于主包)是每一个独立的可运行程序的入口点。
- 除了 main 包之外,其它的包最后都会生成 *.a 文件(也就是包文件)并放置在 GOPATH/pkg/GOPATH/pkg/GOOS_$GOARCH 中
- 用 var 方式来定义全局变量,:= 进行在函数内的简短声明,_ 特殊的变量名,任何赋予它的值都会被丢弃。
- 字符串使用""或``,其不可变,但可以进行切片操作;内置error错误类型;
- iota 枚举
-
声明
import( "fmt" "os" ) const( i = 100 pi = 3.1415 prefix = "Go_" ) var( i int pi float32 prefix string )
-
iota枚举关键字与常量
- 默认开始值是 0,const 中每增加一行加 1
- 每遇到一个 const 关键字,iota 就会重置
- 常量声明省略值时,默认和之前一个值的字面相同
- 在同一行值相同
-
golang变量可见性规则
- 大写字母开头的变量,公有变量,可导出。小写则是私有变量。
-
array, slice, map
- 声明 slice 时,方括号内没有任何字符。slice 的 index 只能是 int 类型
-
数组之间的赋值是值的赋值,传入的其实是该数组的副本,而不是它的指针
//array var arr [10]int // 声明了一个int类型的数组 b := [10]int{1, 2, 3} // 声明了一个长度为 10 的 int 数组,其中前三个元素初始化为 1、2、3,其它默认为 0 c := [...]int{4, 5, 6} // 可以省略长度而采用 `...` 的方式,Go 会自动根据元素个数来计算长度 //slice, 和声明 array 一样,只是少了长度 var fslice []int // 声明并初始化 slice := []byte {'a', 'b', 'c', 'd'} // a 指向数组的第 3 个元素开始,并到第五个元素结束,左开右闭 a = ar[2:5] // 第三个参数指定切片容量 slice = array[2:4:7]
-
slice 引用类型 常用简便操作
- slice 的默认开始位置是 0,ar[:n] 等价于 ar[0:n]
- slice 的第二个序列默认是数组的长度,
ar[n:]
等价于ar[n:len(ar)]
- 如果从一个数组里面直接获取 slice,可以这样
ar[:]
,即等价于ar[0:len(ar)]
,包含了全部的元素
-
slice 常用内置函数
- len 获取 slice 的长度
- cap 获取 slice 的最大容量
- append 向 slice 里面追加一个或者多个元素,然后返回一个和 slice 一样类型的 slice
- copy 函数 copy 从源 slice 的 src 中复制元素到目标 dst,并且返回复制的元素的个数
-
map
var numbers map[string]int numbers = make(map[string]int) numbers["one"] = 1 // 赋值 rating := map[string]float32{"C":5, "Go":4.5, "Python":4.5, "C++":2 } // map 有两个返回值,第二个返回值,如果不存在 key,那么 ok 为 false,如果存在 ok 为 true csharpRating, ok := rating["C#"]
- 通过delete删除map的元素
- map 也是一种引用类型,如果两个 map 同时指向一个底层,那么一个改变,另一个也相应的改变
- map 和其他基本型别不同,它不是 thread-safe,在多个 go-routine 存取时,必须使用 mutex lock 机制
-
make vs new
- new 用于各种类型的内存分配。new 返回指针,即*T类型的值
- make 用于内建类型(map、slice 和 channel)的内存分配。make 返回一个有初始值(非零)的T类型,而不是 *T
-
零值并非是指空值,而是一种变量未填充前的默认值,通常为0
// 常用零值列表 int 0 int8 0 int32 0 int64 0 uint 0x0 rune 0 // rune 的实际类型是 int32 byte 0x0 // byte 的实际类型是 uint8 float32 0 // 长度为 4 byte float64 0 // 长度为 8 byte bool false string "
本作品采用《CC 协议》,转载必须注明作者和本文链接