摘要
本文介绍了go语言中结构体和指针部分的内容,同时介绍了数组指针和结构体指针的隐式转换、数组指针和指针数组等问题。
1、结构体的声明与使用
声明
go中的结构体和C语言中的结构体作用基本一致,但在定义和使用上有所不同。go语言结构体的类型关键字是struct,按照go语言
声明关键字 变量名称 类型关键字
的声明规则,其定义方式应该是:
var Vertex struct{
...
}
但是,结构体本身不是变量值,而是一种类型,go中的类型声明关键字使用的是type
,声明语法如下:
type Vertex struct{
...
}
结构体使用
结构体是一种类型,根据创建的结构体可以实例化变量,通常的实例有以下几种:
type Vertex struct{
X int
Y float64
Z [5]int
}
//1、按顺序赋值
v := Vertex{1, 2.2, [5]int{1,2,3,4,5}}
//2、通过字段名称赋值 ,没赋的直接赋零值
v := Vertex{Y: 2.2, X: 1, Z: [5]int{1,2,3,4,5}}
//3、直接赋零值
v := Vertex{}
结构体字段的访问与C一致,使用点号进行访问。
2、指针
声明与使用
golang中的指针与C基本一致,采用*作为关键字,其声明与使用如下案例:
var i int = 10
var ptr *int = &i
fmt.Printf("字节数据指针,类型:%T,长度:%d,数据长度:%d\n", ptr, unsafe.Sizeof(ptr), unsafe.Sizeof(*ptr))
*********输出结果***********
字节数据指针,类型:*uint8,长度:8,数据长度:1
注意点
golang中的指针基本与C相同,其不同点在于go语言是不支持指针运算的,如如下通过指针运算访问数组不同元素的案例:
var arr = [4]byte{1, 2, 3, 4}
var ptr = &arr
fmt.Println(*(ptr+1)) //错误 支持指针运算
数组指针和结构体指针的隐式转换问题
以数组指针为例,定义数组指针如下:
arr := [4]int{1,2,3,4}
ptr := &arr
在获取数组莫一个元素时需要先通过*ptr获得数组身,再通过索引读取:
b := (*ptr)[2]
由于*ptr[2]是指针数组的使用方式,为了与指针数组的读取相区分,需要为*ptr添加括号
,这是比较麻烦的。
为了方便,golang提供了隐式转换,在使用数组指针或者结构体指针时,可以直接把指针当作变量读取数据
,以结构体为例,案例如下:
type Vertex struct{
X int
Y float64
Z [5]int
}
func main() {
v := Vertex{1, 2.2, [5]int{1,2,3,4,5}}
var ptr = &v
fmt.Println(ptr.Z)
}
*********输出**********
[1 2 3 4 5]
数组指针与指针数组
- 1、数组指针,指该指针指向了一个数组,可以对比参考整形指针:指向整形的指针。
- 2、指针数组:是一个数组,数组中元素为一个个指针,使用案例如下:
a := 0
b := 1000
var pArr [2]*int = [2]*int{&a, &b}
fmt.Println(*pArr[1])
******输出*******
1000
版权声明:本文为qq_38001359原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。