javer转go入门笔记-结构体与指针

  • Post author:
  • Post category:其他




摘要

本文介绍了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 版权协议,转载请附上原文出处链接和本声明。