Golang

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.

golang: change instance address in his method

在实例方法内修改实例地址

1 minute read

前提回顾 对于结构体中的指针应用,大部分可能知道的是如下两代码的区别 func (a *AA) funcA() func (a AA) funcB() 区别在于,我们在funcA内修改a的值,是可以成功的,但是在funcB修改a的值是失败的。 因为funcA中的a是指针传递,funcB中的a是值传递。这个大家都知道。 今天话题 先上代码 package main import ( "fmt" ) type AA struct { xyz string opq string } func (this *AA) Change() { b := &AA{xyz: "xyz1", opq: "opq1"} this = b fmt.Println("in this:", this, "addr:", &this) } func main() { a := &AA{xyz: "xyz0", opq: "opq0"} fmt.Println("before a:", a, "addr:", &a) a.Change() fmt.Println("after a:", a, "addr:", &a) } 那么问题来了,请回答一下程序执行过程的三个输出是什么。