go语言中slice原理和坑。

slice 原理

Slice数据结构和原理

  • 1:相对于数组,Slice的长度是动态可变的。如下:
func CreatSlice() {
   
	s := make([]int, len(), cap())
	var s1 []int
}
func CreatArr() {
   
	var a [length]int
}

可以很清楚的看到,数组的长度是在编译时静态计算的,并且数组无法在运行时动态扩缩容量的。

  • 2:在go的/src/runtime/slice.go中可以看到如下:
type slice struct {
   
    array unsafe.Pointer
    len int
    cap int
}

此外无论是数组还是Slice都是按照值传递。并且!!!!goland中只有值传递!!!

  • 3:slice和数组的传递性能区别。
    talk is cheap, show code
func CallSlice(s []int) {
   

}
func CallArr(s [10000]int) {
   

}

func BenchMarkCallSlice(b *testing.B) {
   
    s := make([]int, 10000)
    for i := 0; i < b.N; i++ {
   
        CallSlice(s)
    }
}

func BenchMarkCallArr(b *testing.B) {
   
    var a [10000

你可能感兴趣的:(go,slice,golang,开发语言,后端)