Post

Golang小记

Go 学习中遇到的难点

Golang小记

小记

cap

  1. cap() 是专门用来测量“容器”的工具,只适用于三种容器类型
    • 切片(slice)
    • 数组(array)
    • 通道(channel)

slice

声明定义

  • []type{}
  • make ([]type, len)
  • make ([]type, len, cap)

首尾初始化

规则:

  • 自动补零
    • string -> “”
    • bool -> false
    • *int -> nil
  • 长度和容量相同
  • 索引不允许出现重复初始化

  • s1 := []int{0, 1, 3, 8: 100}
    • 含义:8: - 初始化到索引8 - 除首部初始化值外,填充0 - 尾部,即索引8 填充 100
  • 易错点
1
2
3
err1 := []int{0, 1, 1:5}  // 索引1 重复初始化,报错
  
err2 := []int{3:1, 2:2}  // 索引越界,但允许,初始化顺序不影响结果

基本操作

  • slice []type := ...
  • s是一个数组或切片
    • s[:] //从0 到 len(s) - 1 的切片, 即所有长度的切片
    • s[low:] //从 low 到 len(s)的切片
    • s(:high) //从 0 到 high - 1的切片
    • s(low:high:max) // 从 low 到 high - 1的切片,容量为 max - low

切片的追加append

规则:

  • 超出原 slice.cap 限制,会触发重新分配底层数组,即使原数组未填满
    • 如: s := data[:2:2] 超出 容量2 就会重新分配原数组
    • 容量重分配规则: 新分配容量是原容量的2倍
  • 追加元素
    • append(slice, 4, 2)
  • 追加完整切片
    • append(slice, slice0)
  • 追加部分切片的元素
    • append(slice, slice0[start:end])

切片拷贝

copy(dest_slice, copy_slice)

  • 允许切片指向同一底层数组、元素区间重叠的情况
  • 拷贝以 len 长度小的为准

切片resize 调整大小

  • 通过再次赋值,赋予不同大小
  • 需要注意越界问题
1
2
3
var a = []int{1, 3, 4, 5}
b := a[1:2]
c := b[0:3]

结构体

  • 结构体与json序列化
  • 结构体标签

流程控制

if

  • 类型断言
  • ```go if s, ok := x.(string); ok{

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
##### 执行流程
- .(string)  检查x的动态类型是否能转为 string
- 若不匹配 
    - ok = false
    - s 获得 `string` 的零值 空字符串 ""
    - 跳过代码段
- 若匹配
    - ok = true
    - s 获得 x 底层的字符串值
    - 执行 {}  内的代码

* 多返回值
    * 
```go
if val, err := obj.func(); err{}

switch

  • 多值判断
  • 不限制类型
  • 能判断变量的类型

循环语句for和range

  • for的用法
    1
    2
    3
    
    for init; condition; post
    for condition
    for  {}//无限循环
    
  • range
  • ```go //一般用法 for index, value := range collection {}

//对于 map for key, value := range map {}

//对于 通道 chan for value := range chan ()

1
2
3
4
5
6
7
8
9
10
11
12
  
### 函数
  
#### 参数
* 不定参数传值   
    * 
```go
//本质上是切片
func mfunc(args ...int) //0个或多个参数
func mfunc(a int, b int, args ...int)  int //两个或多个参数
// 传递任意类型的管理 使用  interface{}
func mfunc(args ...interface{}) 

示例:

1
2
3
func test(s string, n ...int) string {
    for _, i := range n{}
}
  • 使用 slice 对象作为变参传参时需要展开 (slice…)
  • 示例:
    1
    2
    3
    4
    5
    
    func test(s string, n ...int) string{}
    func main(){
      s := []int{1,2,3}
      t := test("123", s...)  // slice... 展开slice
    }
    

返回值

  • 隐式返回和显式返回
  • 可多值返回

闭包

  • 记住创建时的环境,会保留非传参变量的变化
  • 同个函数中创建出的多个闭包,可以相互影响
This post is licensed under CC BY 4.0 by the author.