细节 1:
type S struct{
a int
}
func ret(i int) (s *S) {
defer func() {
fmt.Print(s)
} ()
s = &S{a:10}
if 1 == i {
return
}
return nil //这个地方会改变defer里s的值
}
例如在函数中,可能需要这样写比较安全
func funcName() (ret type) { //type里含有需要释放的资源
ret.Init() //type类型的ret变量初始化
temp := ret //重点,保证ret里资源能够顺利释放
defer func() {
temp.Close() //重点,type类型的ret变量释放资源
} ()
if XXX {
return nil //代码走这里ret值会为空
}
return ret
}
细节 2:
func main() {
a := []int{10,11,12,13}
fmt.Printf("%p %#v\n", a, a)
b := a[:0]
fmt.Printf("%p %#v\n", b, b)
b = append(b, 1)
fmt.Printf("%p %#v\n", a, a)
fmt.Printf("%p %#v\n", b, b)
}
func main() {
a := []int{10,11,12,13}
fmt.Printf("slice address: %p - array address: %p - slice value: %#v\n", &a, a, a)
a = a[:0]
fmt.Printf("slice address: %p - array address: %p - slice value: %#v\n", &a, a, a)
b := a[:0]
fmt.Printf("slice address: %p - array address: %p - slice value: %#v\n", &b, b, b)
}