示例:

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)
}
  1. 这里的字符串b复用了字符串a的一部分,使得
    1. 截取操作很快
    2. 字符串a离开作用域而字符串b没有离开作用域的话,a不能被gc