Go面试题8
1: 关于init
函数, 下面的说法正确的是():
- A. 一个包中, 可以包含多个init函数.
- B. 程序编译时,先执行依赖包的init函数,再执行main包内的init函数.
- C. main包中,不能有init 函数.
- D. init函数可以被其他函数调用.
2: 下面这段代码输出什么以及原因?
package main
import "fmt"
func hello() []string {
return nil
}
func main() {
h := hello
if h == nil {
fmt.Println("nil")
} else {
fmt.Println("not nil")
}
}
- A.
nil
- B.
not nil
- C.
compilation error
3: 下面这段代码能否编译通过? 如果可以, 输出什么?
package main
func GetValue() int {
return 1
}
func main() {
i := GetValue()
switch i.(type) {
case int:
println("int")
case string:
println("string")
case interface{}:
println("interface")
default:
println("unknown")
}
}
参考答案及解析
1: 答案及解析: AB
. 关于init()
函数有几个需要注意的地方:
init()
函数是用于程序执行前做包的初始化函数, 比如初始化包里面的变量等.
一个包可以出现多个init()
函数, 一个源文件也可以包含多个init()
函数;
同一个包中的多个init()
函数的执行顺序没有明确的定义,但是不同包的init
函数是根据包导入的依赖关系决定的如图 .
init()
函数在代码中不能被显示调用, 不能被引用(赋值给函数变量), 否则出现编译错误;
一个包被引用多次, 如A import B, C import B, A import c
,B
被应用多次,但B
包只会初始化一次;
引入包, 不可出现死循环.即A import B, B import A
, 这种情况编译失败;
2: 答案及解析: B. 这道题里面, 是将hello()
赋值给变量h
,而不是函数的返回值,所以输出not nil
.
3: 答案及解析: 编译失败. 考点: 类型选择, 类型选择的语法形如: i.(type)
, 其中i
是接口,type
是固定关键字, 需要注意的是,只有接口类型才能使用类型选择.
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付