考虑这段代码:
type TestStruct struct {
Name string
}
func TestSliceWithPool(t *testing.T) {
var slicePool = sync.Pool{
New: func() interface{} {
t.Log("i am created")
s := make([]interface{}, 0)
return s
},
}
s, _ := slicePool.Get().([]interface{})
t.Logf("Lenth: %d, Cap: %d, Pointer: %p", len(s), cap(s), s)
for i := 0; i < 9000; i++ {
st := &TestStruct{Name: "test"}
s = append(s, st)
}
for _, v := range s {
if value, ok := v.(TestStruct); ok {
if value.Name != "test" {
t.Error("u are changed!")
}
}
}
s = s[:0]
slicePool.Put(s)
s2, _ := slicePool.Get().([]interface{})
t.Logf("Lenth: %d, Cap: %d, Pointer: %p", len(s), cap(s), s)
for i := 0; i < 8000; i++ {
st := &TestStruct{Name: "test2"}
s2 = append(s2, st)
}
for _, v := range s2 {
if value, ok := v.(TestStruct); ok {
if value.Name != "test2" {
t.Error("u are changed!")
}
}
}
slicePool.Put(s2)
}
测试结果为:
slice_test.go:63: i am created
slice_test.go:70: Lenth: 0, Cap: 0, Pointer: 0x1019598
slice_test.go:86: Lenth: 0, Cap: 9728, Pointer: 0xc000500000
为什么只生成一次,地址却不同?为什么上限是 9728?像这样使用同一个切片有什么问题吗?
斯蒂芬大帝
相关分类