面试题:让你捉摸不透的 Go reslice

面试题:

package main

func a() []int {
	a1 := []int{3}
	a2 := a1[1:]
	return a2
}

func main() {
	a()
}

看到这个题, 你的第一反应是啥?

(A) 编译失败
(B) panic: runtime error: index out of range [1] with length 1
(C) []
(D) 其他
第一感觉: 肯定能编译过, 但是运行时一定会panic的. 但事与愿违竟然能够正常运行, 结果是:[]

疑问
a1 := []int{3}
a2 := a1[1:]
fmt.Println("a[1:]", a2)

a1 和 a2 共享同样的底层数组, len(a1) = 1, a1[1]绝对会panic, 但是a[1:]却能正常输出, 这是为何?

从表面入手

整体上看下整体的情况

a1 := []int{3}
fmt.Printf("len:%d, cap:%d", len(a1), cap(a1))
fmt.Println("a[0:]", a1[0:])
fmt.Println("a[1:]", a1[1:])
fmt.Println("a[2:]", a1[2:])

结果:

len:1, cap:1
a[0:]: [1]
a[1:] []
panic: runtime error: slice bounds out of range [2:1]

从表面来看, 从a[2:]才开始panic, 到底是谁一手造成这样的结果呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值