指针
本章围绕字符串, 数字, 数组, 切片, map,channel, 结构体与指针赋值及函数传参的应用剖析
字符串
字符串本身也是 StringHeader 的结构体, 包含 Data 指针与字符串长度, 如下
- type StringHeader struct {
- Data uintptr
- Len int
- }
Data 指向的内存地址不可更改, 字符串赋值和传参只是拷贝了 StringHeader 中 Data 和 Len 的值
- package main
- import "fmt"
- func main() {
- str := "Hello World!"
- var data string
- data = str
- // 拷贝 str 中 Data 与 Len
- fmt.Println(data)
- data = "Hello Go!"
- // 修改 data 的值 在内存中生成新的 StringHeader 结构体 并赋值给 data
- fmt.Println(data)
- // str 内存未改变
- fmt.Println(str)
- }
- //Hello World!
- //Hello Go!
- //Hello World!
当声明变量为字符串指针时, 变量赋值时对象一定是字符串内存地址, 函数传参时拷贝的也是内存地址而已
- package main
- import "fmt"
- func main() {
- str := "Hello World!"
- var ptr *string
- // 错误方法 str 是字符串类型非指针类型
- //ptr = str
- // 正确方式 获取 str 的地址 赋值给 ptr
- ptr = &str
- fmt.Println(ptr)
- fmt.Println(*ptr)
- }
- //0xc0000421c0
- //Hello World!
来源: http://www.bubuko.com/infodetail-3207228.html