Slice

How golang slice Semi - pointer.

golang slice怎么个半指针传递

2 minute read

起因 刷leetcode的77题时候,使用了递归方法,并且使用数组时候如下 result := make([][]int, 0, length+1) recursive([]int{}, 1, n, k, result) 第一次使用了cap声明slice,这样的好处是append时候在length后添加数据,并且保证长度够,append时候不会重新申请地址 但是跑的时候发现,recursive()后,在返回到此段代码,居然什么都没有!result值没变。 什么? slice不是传说的指针传递么? 先看下官方数组结构样子 当然,一直知道数组是半指针,就是将数组的地址的值传进去。在函数里是改变不了指针的值,但是可以操作指针指向的数据,详细的google有很多 我想象的是这样:函数收到的是数组的头地址(就是图最上面的指针),length和cap等数据,这样可以完全接管数组的操作了 但是上述起因里出现的问题却不是这样,到底是什么原因呢?于是写了测试代码 func main() { result := make([]int, 0, 10) addr := &result fmt.Println("result:", result, "addr:", unsafe.Pointer(addr)) for i := 0; i < 10; i++ { functions(result) result = append(result, i) //appendData(result,i) } fmt.Println("result:", result, "addr:", unsafe.Pointer(addr)) } func functions(arr []int) { addr := &arr if len(arr) > 0 { fmt.

go map,slice,array 遍历性能测试

golang testing about iterating map,slice,array.

qwding

2 minute read

#就是随便试试 听说goalng的map和slice的遍历性能差的不是一点半点,于是没事写个benchmark来玩玩 代码 package testings import( "testing" "strconv" ) var length = 1000 var maps map[string]string var slices []string var arrays [1000]string func init(){ maps = make(map[string]string,length) slices = make([]string,length) for i:=0;i<length;i++{ maps[strconv.Itoa(i)] = "abc" slices[i] = "abc" arrays[i] = "abc" } } func BenchmarkIterateMap(b *testing.B){ for i:=0;i<b.N;i++{ for , = range maps{ } } } func BenchmarkIterateSlices(b *testing.B){ for i:=0;i<b.N;i++{ for , = range slices{ } } } func BenchmarkIterateArrays(b *testing.