Go面试题8

Posted by     "" on Thursday, December 19, 2019

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函数是根据包导入的依赖关系决定的如图 go初始化 .
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是固定关键字, 需要注意的是,只有接口类型才能使用类型选择.

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

使用微信扫描二维码完成支付