Go面试集锦
2017-08-31 本文已影响59人
ironbox_boy
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顾名思义是追加的意思。