Fork me on GitHub

Go语言内置的所有数据类型

列表为go内置的所有数据类型,包括基本数据类型,例如int,byte,rune,string;也有引用数据类型,例如slice,map,channel等;还有interface,函数等

如果想获取任何类型变量的存储地址,使用&(取地址符)

1
2
str := "you are my sunshine"
fmt.Printf("addr:%p\n", &str)

输出:

1
addr:0xc0000621c0

字符串一旦创建不可修改,所以如果要修改字符串,可先将其转换成 []rune 或 []byte,完成后再转换为 string。⽆论哪种转换,都会重新分配内存,并复制字节数组(本质上,修改后的字符串已不是原始的字符串,他们彼此占用了独立的内存空间)。

1
2
3
4
5
6
s := "abcd"
b := []byte(s)
b[0]='A'
fmt.Printf("b:%s\n",b)
fmt.Printf("s addr:%p\n",&s)
fmt.Printf("b addr:%p\n",&b)

输出:

1
2
3
b:Abcd
s addr:0xc000094010
b addr:0xc000096000

Go 函数返回局部变量指针是安全的,不同于c/c++,编译器会根据需要,将该局部变量的内存分配在GC Heap上

1
2
3
4
5
6
7
8
9
10
11
12
func main(){
p := test()
fmt.Println("in main:",p)
*p = 88
fmt.Printf("modified:%d\n",*p)
}

func test() *int {
x := 100
fmt.Printf("local var addr:%p\n",&x)
return &x
}

输出:

1
2
3
local var addr:0xc000094000
in main: 0xc000094000 //同一个空间
modified:88 //可以访问返回的局部变量地址空间
您的鼓励是我持之以恒的动力