Post

golang

go简介

  • 静态类型
  • 运行是runtime

基础题

  • https://learnku.com/articles/35063

规范

  • 相似的变量放在一起声明
  • import包顺序,标准库、第三方库
  • 包名全部小写
  • map、slice初始化
  • 枚举从1开始
  • 可以指定slice的容量

变量类型

  • 值类型:array、int、struct
  • 引用类型:map、slice、channel、指针、interface、函数

类型比较

  • 可比较:int、float、string、bool、pointe、channel、interface、array
  • 不可比较(编译报错):slice、map、func
  • 复合类型含有不可比较的类型,则该类型也是不可比较;如struct
    • struct含有不可比较类型时,可用reflect.DeepEqual比较
  • 浅析go中的类型比较:https://segmentfault.com/a/1190000039005467

优点

  • 编译快
  • 执行效率高
  • 内存管理GC
  • 海量并发

缺点

  • 第三方库不够多、不够稳定
  • 错误处理代码冗余

struct值接收者和指针接收者

  • 值类型调用者、指针类型调用均可调用值接受者和指针接收者定义的方法

  • 指针接收者可以修改调用方的值,而值类型接收者不可以

  • 当有定义接口,接收者为指针时,值类型的调用者不能赋给该接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    type People interface {
    	Say() 
    }
      
    type Student struct {
    	Name string
    }
      
    func (stu *Student) Say()  {
    	fmt.Println("say name: ", stu.Name)
    	return 
    }
      
    func Test36(t *testing.T) {
    	var p People
    	stu := Student{"d"}
    	p = stu // 编译报错
    	p.Say()
    }
    

iota

不同 const 定义块互不干扰(遇到const会重置成0)
1
2
3
4
5
6
7
8
9
func Test40(t *testing.T) {
	const a = iota

	const (
		b = iota
	)
	fmt.Println(a) // 0
	fmt.Println(b) // 0
}
非空行则加一
  • 从第一行开始,iota 从 0 逐行加一
  • 没有表达式的常量定义复用上一行的表达式
  • 同一行,iota值相等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
func Test41(t *testing.T) {
	const (
		c    = 10                        // iota:0; 输出:10; 从第一行开始,iota 从 0 逐行加一
		d    = iota                      // iota:1; 输出:1
		e                                // iota:2; 输出:2; 没有表达式的常量定义复用上一行的表达式
		f    = "hello"                   // iota:3; 输出:hello
		g                                // iota:4; 输出:hello
		h    = iota                      // iota:5; 输出:5
		i                                // iota:6; 输出:6
		j    = 0                         // iota:7; 输出:0
		k                                // iota:8; 输出:0
		l, m = iota, iota                // iota:9; 输出:9, 9; 同一行,iota值相等
		n, o                             // iota:10; 输出:10, 10
		p    = iota + 1                  // iota:11; 输出:11 + 1
		q                                // iota:12; 输出:12 + 1
		_                                // iota:13; 输出:
		r    = iota * iota               // iota:14; 输出:14 * 14
		s                                // iota:15; 输出:15 * 15
		tt   = r                         // iota:16; 输出:196
		u                                // iota:17; 输出:196
		v    = 1 << iota                 // iota:18; 输出:1 << 18
		w                                // iota:19; 输出:1 << 19
		x                  = iota * 0.01 // iota:20; 输出:20 * 0.01
		y    float32       = iota * 0.01 // iota:21; 输出:21 * 0.01
		z                                // iota:22; 输出:22 * 0.01
	)

	fmt.Println(c)  
	fmt.Println(d)  
	fmt.Println(e)  
	fmt.Println(f)  
	fmt.Println(g)  
	fmt.Println(h)  
	fmt.Println(i)  
	fmt.Println(j)  
	fmt.Println(k)  
	fmt.Println(l)  
	fmt.Println(m)  
	fmt.Println(n)  
	fmt.Println(o)  
	fmt.Println(p)  
	fmt.Println(q)  
	fmt.Println(r)  
	fmt.Println(s)  
	fmt.Println(tt) 
	fmt.Println(u)  
	fmt.Println(v)  
	fmt.Println(w)  
	fmt.Println(x)  
	fmt.Println(y)  
	fmt.Println(z)  
}

for循环

  • 三种形式:for、for+赋值、for+range

  • 支持continue、break等操作

  • 1
    2
    3
    4
    5
    6
    7
    
    func TestFor(t *testing.T) {
    	...
    	for i, v := range l {
    		...
    	}
    	...
    }
    
    • i、v是同一块内存

for-range

  • 注意for- range中删除元素,新增元素的场景

  • https://zhuanlan.zhihu.com/p/105435646

控制goroutine数量

  • 1、chan
  • 2、sync.WaitGroup
  • 3、协程池(chan + sync)

goroutine泄露场景

  • 1、goroutine无限阻塞等待
  • 2、goroutine死循环

参考

  • https://segmentfault.com/a/1190000022285902
This post is licensed under CC BY 4.0 by the author.