Go面试题42
1: 请指出下面代码的错误?
package main
var gvar int
func main() {
var one int
two := 2
var three int
three = 3
func (unused string) {
fmt.Println("Unused arg. No compile error")
}("what?")
}
2: 下面代码输出什么?
type ConfigOne struct {
Daemon string
}
func (c *ConfigOne) String() string{
return fmt.Sprintf("print: %v", c)
}
func main() {
c := &ConfigOne{}
c.String()
}
3: 下面代码输出什么?
func main() {
var a = []int{1,2,3,4,5}
var r = make([]int,0)
for i, v := range a {
if i == 0 {
a = append(a, 6, 7)
}
r = apppend(r, v)
}
fmt.Println(r)
}
参考答案及解析
1: 答案及解析: 变量one, two和three
声明未使用.知识点: 未使用变量. 如果有未使用的变量代码将编译失败.但也有例外,函数声明中的变量必须要使用,但可以由未使用的全局变量。函数的参数未使用也可以的.
如果你给未使用的变量分配了一个新值,代码也还是会编译失败. 你需要在某个地方使用这个变量, 才能编译器愉快的编译.
修复代码:
func main() {
var one int
_ = one
two := 2
fmt.Println(two)
var three int
three = 3
one = three
var four int
four = four
}
另一个选择是注释掉或者移除未使用的变量.
2: 答案及解析: 运行时错误
.如果类型实现了String()
方法, 当格式化输出时会自动使用String()
方法.上面代码是在该类型的String()
方法内使用格式化输出,会导致递归调用,最后抛错:
runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow
3: 答案及解析: [1 2 3 4 5]
. a
在for range
过程中增加了两个元素由5
增加到了7
,但是for range
时会使用a
的副本参与循环,副本的len
依旧是5
,因此for range
只会循环5次, 也就是只获取a
对应的底层数组的前5
个元素
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付
