GO 易考易错点


1 Go下划线的作用

Go下划线其实有两种作用。

1.忽略变量。

这个应该是最简单的用途。比如某个函数返回三个参数,但是我们只需要其中的两个,另外一个参数可以忽略,这样的话代码可以这样写:

v1, v2, _ := function(...)

还有一种,用在import package,在执行当前文件的代码之前会先调用import 包中的初始化函数(init),这种使用方式仅让导入的包做初始化,而不使用包中其他功能,例如:

import _ "test"

2.接口断言

判断某个结构体是否实现了某个方法,如果没有实现则编译失败。例如:

var _ Foo = Dog{}

判断Dog结构体是否实现了Foo接口,如果没有实现则编译失败。

2 Go import 点和下划线的区别

import的时候使用点可用省略包名,例如: import . "fmt",则代码种可直接用Println(),而不需要在Println前面加fmt.

import的使用是使用下划线,表示只引用包中的init方法,而不引用包中其他功能。

3 Go import执行顺序

1.在同一个文件中,依次执行:常量初始化、变量初始化、init方法、main方法

2.在同一个包的不同文件中,按文件顺序先后执行

3.在不同包中,按import引入的顺序倒序执行

4 自定义对象数组如何按指定字段或者规则排序

让自定义对象数组实现sort包的interface接口:Len() int;Less(i,j int) bool;Swap(i,j int)

5 go select用法

跟 switch-case 相比,select-case 用法比较单一,它仅能用于 信道/通道 的相关操作

5.1 用法一:从多个通道中接收数据

select 会从多个case 语句中选择可执行的语句,哪个通道准备好了就执行哪个,如果都准备好了就随机选择一个执行;如果都每准备好则选择default执行;如果没有default语句则阻塞,等待有一个case可执行。

5.2 避免死锁

一般会使用default语句或者在某个case语句中设置一个定时器,避免所有case都得不到执行而阻塞,造成死锁

5.3 超时控制

当某个阻塞性的操作被阻塞时,为了避免长时间阻塞,在一个case中设置超时,当超时时间到了就会走这个case

6 channel需要注意的几个问题

channel有大小

  • 当容量为0时,说明信道中不能存放数据,在发送数据时,必须要求立马有人接收,否则会报错。此时的信道称之为无缓冲信道。接收者要先于发送者启动。
  • 当容量为1时,说明信道只能缓存一个数据,若信道中已有一个数据,此时再往里发送数据,会造成程序阻塞。 利用这点可以利用信道来做锁。
  • 当容量大于1时,信道中可以存放多个数据,可以用于多个协程之间的通信管道,共享资源。

    需要注意的几个问题

    (1) 关闭一个未初始化的 channel 会产生 panic

    (2) 重复关闭同一个 channel 会产生 panic

    (3) 向一个已关闭的 channel 发送消息会产生 panic

    (4) 从已关闭的 channel 读取消息不会产生 panic,且能读出 channel 中还未被读取的消息,若消息均已被读取,则会读取到该类型的零值。

    (5) 从已关闭的 channel 读取消息永远不会阻塞,并且会返回一个为 false 的值,用以判断该 channel 是否已关闭(x,ok := <- ch)

    (6)关闭 channel 会产生一个广播机制,所有向 channel 读取消息的 goroutine 都会收到消息

    (7)channel 在 Golang 中是一等公民,它是线程安全的,面对并发问题,应首先想到 channel。

6 一个目录里面可以至多两个包

一个正常的,一个以它为前缀,以 “_tset”为后缀的test包,如”abc”,”abc_test”两个包,”abc_test”必需在test文件中

============持续更新========================

7 参考

【1】go import使用及. _的作用解析

【2】golang 下划线三种用处

【3】理解 Go 语言中的 select 用法


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录