Golang编程(基础篇)

96 阅读2分钟

这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战

1. 关于函数传参

  1. 除了闭包是引用传递之外,其他(如byte/int/int64/uint32等)都是值传递
  2. 数组,跟数组相关的类型:整体复制,各元素可读写。
  3. 字符串:只读的字节数组,仅复制了数据地址和对应的长度。
  4. 切片:传递切片头信息(含指针),各元素可读写。

2. Slice|切片

  1. 若元素为指针时,删除操作需要将切片元素置为 nil 便于内存回收。
  2. 获取长度 len(l1)。
  3. 获取容量 cap(l1)。
  4. 添加元素 l1 = append(l1, 10)。
  5. 复制元素 copy(l1, l2)。
  6. 使用 make() 时,第二个参数时初始化 n 个为 0 的元素;第三个参数为容量,可选,只影响初始化容量,不影响后续扩容。
  7. var l1 []int = make([]int, 0) 不完全等价于 var l1 []int = nil
  8. var l1 []int = make([]int, 1) 等价于 var l1 []int = []int{0}
  9. l1 = make([]int, 0) 等价于 l1 = l1[:0]

3. Map|字典

  1. 删除指定key:delete(m1, 10)。可以在循环中执行
  2. 获取大小 len(m1)。
  3. 遍历:无序。
  4. 使用 make() 时,第二个参数为容量,可选,只影响初始化容量,不影响后续扩容。
  5. var m1 = make(map[int]string) 不等价于 var m1 map[int]string = nil

4. Channel|管道

  1. 使用 make() 初始化时,第二个参数为缓冲区大小,建议必填(否则生产者阻塞直到被消费)。若元素数目等于此值时,会阻塞继续添加元素。
  2. 使用:select{ case val, ok :=<- myChannel: xxoo },当 channel 被关闭后,ok值为false。

5. make(T, ...) 函数

  1. 如上所述,是 Slice、Channel、Map 这三种数据结构的构造函数。

6. new(T) 函数

  1. 为类型为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…