Go面试题21

Posted by     "" on Wednesday, December 25, 2019

Go面试题21

1: 下面的两个切片声明中有什么区别?哪个更可取?

A. var a []int
B. a := []int{}

2: A,B, C, D 哪些选项有语法错误?

type S struct {

}

func f(x interface{}) {
}

func g(x *interface{}){
}

func main() {
    s := S{}
    p := &s
    f(s) // A
    g(s) // B
    f(p) // C
    g(p) // D
}

3: 下面A, B两处应该填入什么代码, 才能保证顺利打印出结果?

type S struct {
    m string
}

func f() *S {
    return __ // A
}

func main() {
    p := __ // B
    fmt.Println(p.m) // print "foo"
}

参考答案及解析

1: 答案及解析: A. 声明的是nil 切片;B 声明的是长度和容量都为0的空切片.第一种切片声明不会分配内存, 优先选择.

2: 答案及解析: BD. 函数参数为interface{}时可以接受任何类型的参数,包括用户自定义类型等,即使是接收指针类型也用interface{}, 而不是使用*interface{}.

永远不要使用一个指针指向一个接口类型,因为它已经是一个指针.func foo(p *interface{})这个写法是错误的,应该把*去掉

3: 参考答案及解析:

A. &S{"foo"}
B. *f() 或者 f()

f()函数返回参数是指针类型,所以可以用&取结构体的指针;B 处,如果填*f(),则pS类型;如果填f()p*S类型,不过都可以使用p.m取得结构体的成员.

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

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