本章围绕字符串、数字、数组、切片、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!
原文:https://www.cnblogs.com/lianzhilei/p/11563853.html