Go面试题42

Posted by     "" on Tuesday, January 7, 2020

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]. afor range过程中增加了两个元素由5增加到了7,但是for range时会使用a的副本参与循环,副本的len依旧是5,因此for range 只会循环5次, 也就是只获取a对应的底层数组的前5个元素

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

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