1、分类
|
类型 |
名称 |
长度 |
默认值 |
说明 |
|
pointer |
指针 |
|
nil |
|
|
array |
数组 |
|
0 |
|
|
slice |
切片 |
|
nil |
引⽤类型 |
|
map |
字典 |
|
nil |
引⽤类型 |
|
struct |
结构体 |
|
|
|
2、指针
指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。Go语言对指针的支持介于Java语言和C/C++语言之间,它既没有想Java语言那样取消了代码对指针的直接操作的能力,也避免了C/C++语言中由于对指针的滥用而造成的安全和可靠性问题。
Go语言虽然保留了指针,但与其它编程语言不同的是:
- 默认值 nil,没有 NULL 常量
- 操作符 "&" 取变量地址, "*" 通过指针访问目标对象
- 不支持指针运算,不支持 "->" 运算符,直接⽤ "." 访问目标成员
示例:
package main //必须有个main包
import "fmt"
func main() {
var a int = 10
//每个变量有2层含义:变量的内存,变量的地址
fmt.Printf("a = %d
", a) //变量的内存
fmt.Printf("&a = %v
", &a)
//保存某个变量的地址,需要指针类型 *int 保存int的地址, **int 保存 *int 地址
//声明(定义), 定义只是特殊的声明
//定义一个变量p, 类型为*int
var p *int
p = &a //指针变量指向谁,就把谁的地址赋值给指针变量
fmt.Printf("p = %v, &a = %v
", p, &a) //%v 自动配置类型
*p = 666 //*p操作的不是p的内存,是p所指向的内存(就是a)
fmt.Printf("*p = %v, a = %v
", *p, a)
}
#执行结果:
a = 10 &a = 0xc00000c198 p = 0xc00000c198, &a = 0xc00000c198 *p = 666, a = 666