原文地址:Go-每日面试题目~(三)
1、以下代码有什么问题?
func get() []byte {
raw := make([]byte, 10000)
fmt.Println(len(raw), cap(raw), &raw[0])
return raw[:3]
}
func main() {
data := get()
fmt.Println(len(data), cap(data), &data[0])
}
上述代码中的get()函数返回的切片与原切片公用底层数组,如果在调用函数里面(这里是main()函数)修改返回的切片,将会影响到原切片,可以如下调整:
func get() []byte {
raw := make([]byte, 10000)
fmt.Println(len(raw), cap(raw), &raw[0])
res := make([]byte, 3)
copy(res, raw[:3])
return res
}
func main() {
data := get()
fmt.Println(len(data), cap(data), &data[0])
}
2、以下代码会输出什么?请简要说明。
type foo struct{ Val int }
type bar struct{ Val int }
func main() {
a := &foo{Val: 5}
b := &foo{Val: 5}
c := foo{Val: 5}
d := bar{Val: 5}
e := bar{Val: 5}
f := bar{Val: 5}
fmt.Print(a == b, c == foo(d), e == f)
}
以上代码会输出false true true,上述代码唯一有疑问的地方可能就是第一个比较,Go语言里没有引用变量,每个变量都占用一个惟一的内存位置,所以第一个比较输出false,之后就不需要多说了吧。。。
3、以下代码会输出什么?请简要说明。
func A() int {
time.Sleep(100 * time.Millisecond)
return 1
}
func B() int {
time.Sleep(1000 * time.Millisecond)
return 2
}
func main() {
ch := make(chan int, 1)
go func() {
select {
case ch <- A():
case ch <- B():
default:
ch <- 3
}
}()
fmt.Println(<-ch)
}
以上代码的1和2会随机输出,原因有疑问的咱之后再聊哈。
至此,本次分享就结束了,后期会慢慢补充。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众,获取更多优质内容。