前两天发现一个关于go slice赋值的问题,测试代码如下:

a := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
b := a[:5]
c := b[:10]  
fmt.Println("a:", a, " b:", b, " c:", c)

结果: a: [1 2 3 4 5 6 7 8 9 0] b: [1 2 3 4 5] c: [1 2 3 4 5 6 7 8 9 0]
//指针指向加len的拷贝

如果c赋值的语句改为c:=b[9]则直接panic。

slice的具体结构如下:

 struct Slice
 { // must not move anything  
    byte* array;      // actual data  
    uintgo len;     // number of elements  
    uintgo cap;     // allocated number of elements  
 }; 

这情况应该是len长度的检验问题