Go面试集锦

1.interface与nil的比较(具体参考)
package main
import (
    "fmt"
)
type People interface {
    Show()
}
type Student struct{}

func (stu *Student) Show() {
}

func live() People {
    var stu *Student
    return stu
}
func main() {
    if live() == nil {
        fmt.Println("AAAAAAA")
    } else {
        fmt.Println(live())
        fmt.Println("BBBBBBB")
    }
}
//  Output: BBBBBBB
//  ##在对interface实例化中interface{}中会存储对应的类型指针和值指针,So比较会返回false。
//  ##打印live()后也是nil,其实过程中是做了转化。
2.panic与defer之争
package main
import (
    "fmt"
)
func main() {
    defer func() { fmt.Println("A") }()
    defer func() { fmt.Println("B") }()
    defer func() { fmt.Println("C") }()
    panic("触发异常")
    defer func() { fmt.Println("D") }()
}
//  Output : 
//  C
//  B
//  A
//  panic: 触发异常 ...
//  ##defer是栈式执行,out:CBA;panic之前,正常输出,之后异常。
3.range循环对象变量地址误区
package main
import (
    "fmt"
)
func main() {
    pase_student()
}
type student struct {
    Name string
    Age  int
}
func pase_student() {
    m := make(map[string]*student)
    stus := []student{
        {Name: "zhou", Age: 24},
        {Name: "li", Age: 23},
        {Name: "wang", Age: 22},
    }
    fmt.Println(stus)
    for _, stu := range stus {
        m[stu.Name] = &stu
    }
    fmt.Println(m)
}
//  output :
//  [{zhou 24} {li 23} {wang 22}]
//  map[zhou:0xc42000a0e0 li:0xc42000a0e0 wang:0xc42000a0e0]
//  ##打印过程可以看出m中键的值地址一样,因为stu是一个变量,三次都把一个变量的地址赋值给对应键。
4.slice的初始化和append的语法
package main
import(
    "fmt"
)
func main() {
    s := make([]int, 3)
    fmt.Println(s)
    s = append(s, 1, 2, 3)
    fmt.Println(s)
}
//  Output:
//  [0 0 0]
//  [0 0 0 1 2 3]
//  ##首先slice初始化会为0(非基本类型为nil),append顾名思义是追加的意思。

你可能感兴趣的:(Go面试集锦)