这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战
1. 关于函数传参
- 除了闭包是引用传递之外,其他(如byte/int/int64/uint32等)都是值传递。
- 数组,跟数组相关的类型:整体复制,各元素可读写。
- 字符串:只读的字节数组,仅复制了数据地址和对应的长度。
- 切片:传递切片头信息(含指针),各元素可读写。
2. Slice|切片
- 若元素为指针时,删除操作需要将切片元素置为 nil 便于内存回收。
- 获取长度 len(l1)。
- 获取容量 cap(l1)。
- 添加元素 l1 = append(l1, 10)。
- 复制元素 copy(l1, l2)。
- 使用 make() 时,第二个参数时初始化 n 个为 0 的元素;第三个参数为容量,可选,只影响初始化容量,不影响后续扩容。
- var l1 []int = make([]int, 0) 不完全等价于 var l1 []int = nil
- var l1 []int = make([]int, 1) 等价于 var l1 []int = []int{0}
- l1 = make([]int, 0) 等价于 l1 = l1[:0]
3. Map|字典
- 删除指定key:delete(m1, 10)。可以在循环中执行。
- 获取大小 len(m1)。
- 遍历:无序。
- 使用 make() 时,第二个参数为容量,可选,只影响初始化容量,不影响后续扩容。
- var m1 = make(map[int]string) 不等价于 var m1 map[int]string = nil
4. Channel|管道
- 使用 make() 初始化时,第二个参数为缓冲区大小,建议必填(否则生产者阻塞直到被消费)。若元素数目等于此值时,会阻塞继续添加元素。
- 使用:
select{ case val, ok :=<- myChannel: xxoo },当 channel 被关闭后,ok值为false。
5. make(T, ...) 函数
- 如上所述,是 Slice、Channel、Map 这三种数据结构的构造函数。
6. new(T) 函数
- 为类型为T的新项分配已置零的内存空间,并返回一个指针。
var l1 = new([]int)
*l1 = append(*l1, 4)
fmt.Printf("%#v, %d, %d \n", l1, len(*l1), cap(*l1))
var m1 = new(map[int]string)
// 如果注释掉下面这行 会报错
*m1 = make(map[int]string)
(*m1)[1] = "one"
fmt.Printf("%#v, %d, \n", m1, len(*m1))
Golang最常用的基本类型就介绍到这啦,顺便推荐细读一篇入门经典《Effective-go》:golang.org/doc/effecti…