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()
,则p
是S
类型;如果填f()
则p
是*S
类型,不过都可以使用p.m
取得结构体的成员.
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付