runtime.goexit()
C:/Program Files/Go/src/runtime/asm_amd64.s:1371 +0x1 fp=0xc0000dbfe8 sp=0xc0000dbfe0 pc=0x435da1
Process finished with the exit code 2
1
2
3
4
5
6
7
8
9
10
11
12
13
【go语言字符串下标 go 字符串数组】14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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
37
38
39
40
41
42
43
44
45
46
在上面的代码中 , 因为在go语言中不能进行指针的加减运算,因此取切片,让b的Data指针指向’,'所在的位置 。然后把"hello,world"中的逗号改为点,但是发现还是不行,程序直接崩溃了 。看来go语言中的指针得到了大大的限制,设计者并不想让程序员过度使用指针来写出一些不安全的代码 。
3、使用string给另一个string赋值
Golang中的字符串的赋值并不是拷贝底层的字符串数组 , 而是数组指针和长度字段的拷贝 。例如:当我们定义了一个字符串 a := “hello,world” 然后定义了 b := a 底层所做的操作只是创建了两个StringHeader的结构体,它们的Data字段都指向同一段数据 , 如下图:
在这里插入图片描述
我们可以利用代码来证实这一点:
package main
import (
"fmt"
"reflect"
"unsafe"
)
func main() {
a := "hello,world"
b := a
fmt.Println(a)
fmt.Println(b)
aptr := (*reflect.StringHeader) (unsafe.Pointer(a))
bptr := (*reflect.StringHeader) (unsafe.Pointer(b))
fmt.Println("a ptr:", unsafe.Pointer(aptr.Data))
fmt.Println("b ptr:", unsafe.Pointer(bptr.Data))
}
// 运行结果
hello, world
hello, world
a ptr: 0x6bdb76
b ptr: 0x6bdb76
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
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
在上面的代码中,将a和b转换为StringHeader类型的指针,然后分别打印出,a和b的Data指针的值,发现是相同的
那么如果对a做切片赋值给b呢?
func main() {
a := "hello,world"
b := a[6:]
fmt.Println(a)
fmt.Println(b)
aptr := (*reflect.StringHeader) (unsafe.Pointer(a))
bptr := (*reflect.StringHeader) (unsafe.Pointer(b))
fmt.Println("a ptr:", unsafe.Pointer(aptr.Data))
fmt.Println("b ptr:", unsafe.Pointer(bptr.Data))
}
// 运行结果
hello,world
world
a ptr: 0xd4d849
b ptr: 0xd4d84f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
推荐阅读
- 直播卖土鸡文案怎么说,直播卖土鸡文案怎么说好听
- 小白袋牛奶如何推广卖,小白袋纯牛奶哪个品牌好
- 解谜冒险手机游戏ghost,解谜冒险游戏单机
- 分页查询代码java java分页查询原理思路
- 淘宝店铺如何建立营销,淘宝店铺如何建立营销模式
- 枪战射击游戏手游联机,好玩的枪战游戏手游联机
- u盘图标不显示怎么办,u盘在桌面不显示怎么回事
- go语言开发工具排行榜 go语言开发gui
- c语言写名字代码怎么写,用c语言写出自己的名字