示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package main import ( "fmt" "unsafe" ) func main() { substr() } type String struct { str *byte length int } func (s *String) String() string { return fmt.Sprintf("str: %p\nlen: %d", s.str, s.length) } func inspectString(s *string) { a := (*String)(unsafe.Pointer(s)) fmt.Printf("%s\n", a.String()) } // 变量a的地址比变量b的地址大16字节,一方面体现了栈是向下走的,先分配a,在分配b // 另一方面,也体现了字符串变量占用的内存大小是16字节,一个指针和一个int // 变量b的str指针比变量a的str指针大2,说明b没有产生新的字符串内容 func substr() { a := "12345" b := a[2:4] println("a:", &a) inspectString(&a) println("b:", &b) inspectString(&b) } |
- 这里的字符串b复用了字符串a的一部分,使得
- 截取操作很快
- 字符串a离开作用域而字符串b没有离开作用域的话,a不能被gc