7 天能找到 Go 工作吗?学学 Go 数组和指针试试

举报
梦想橡皮擦 发表于 2022/08/04 14:10:37 2022/08/04
【摘要】 学习之前对于一个 Python 工程师来说,数组和指针在 Python 中都没有明确概念,所以这部分知识点只能依赖 C/C++的积累了。学习数组的时候,可以参考 Python 的列表进行实践。 Go 数组先看一下数组的定义,它是一个由固定长度的特定数据类型元素组成的序列,其中有两个关键点,其一是数组长度固定,其二是特定数据类型。其语法结构如下:var variable_name [SIZE...

学习之前

对于一个 Python 工程师来说,数组和指针在 Python 中都没有明确概念,所以这部分知识点只能依赖 C/C++的积累了。

学习数组的时候,可以参考 Python 的列表进行实践。

Go 数组

先看一下数组的定义,它是一个由固定长度的特定数据类型元素组成的序列,其中有两个关键点,其一是数组长度固定,其二是特定数据类型。

其语法结构如下:

var variable_name [SIZE] varuable_type
// var 变量名 [元素长度/数量] 数据类型

其中元素数量要求必须是整数类型,数据类型可以是任意基本类型,当然包括数组类型,该情况就会形成多维数组。

package main

import "fmt"

func main() {

	var a_array [3]int
	fmt.Println(a_array [0]) // 打印第一个元素
	fmt.Println(a_array [1]) // 打印第二个元素
}

测试代码之后,会发现数组未初始化前,默认值就是数据类型的零值,对于数组也存在索引取值的问题,这点有其它语言的基础,很容易理解。

下面在看一下如何对数组进行初始化操作。

package main

import "fmt"

func main() {
	var a_array1 [3]int = [3]int{1, 3, 5}
	var a_array2 [3]int = [3]int{4, 6}
	fmt.Println(a_array1[2])
	fmt.Println(a_array2[2])
}

可以看到数组输出结果显示如下:

5
0

第二个数组变量 a_array2 由于没有做初始化,所以直接展示为 0 。

上述在初始化数组的时候,都是知道数组长度的,如果不确定数组长度,可以使用 ... 对数组进行初始化。

package main

import "fmt"

func main() {

	a_array := [...]int{1, 2, 3}
	fmt.Printf("%T\n", a_array)
}

打印输出的 %T 表示输出类型。

数组一旦声明长度之后,无法修改,该知识点你可以用代码复现一下。

Go 指针

在 Go 中,取地址符是 &,使用 &var 就可以获取 var 的内存地址。

测试代码如下所示:

package main

import "fmt"

func main() {

	var vari1 int = 10

	fmt.Printf("变量地址:%x\n", &vari1)
}

输出结果如下所示:

变量地址:c000012088

Go 指针和 C 指针一样的概念,指针变量就是声明一个指向内存地址的变量。

在使用前,需要提前进行声明,格式如下:

var var_name *var_type

其中 var_type 为指针类型,var_name 是指针变量名,特殊符号 * 标记指针。

例如我们声明一个整型指针,可以使用下述格式。

var int_ptr *int

指针如果被声明但未被赋值,默认值是 nil,大家习惯指针的缩写是 ptr

在 Go 中每个变量都有地址,指针的值就是地址。

接下来我们可以进行下面的这个实验,从指针获取【指针指向的值】,代码如下:

var vari1 int = 10

fmt.Printf("变量地址:%x\n", &vari1)

// 声明一个变量 ptr,用于存储变量地址
ptr := &vari1

// 输出 ptr 类型
fmt.Printf("ptr 类型:%T\n", ptr)

// 打印 ptr 的值
fmt.Println("ptr 值:", ptr)

// 对指针取值
value := *ptr
fmt.Printf("值类型:%T\n", value)

// 获取指针指向的值
fmt.Println("指针指向的值:", value)

输出内容如下所示:

变量地址:c000012088
ptr 类型:*int
ptr 值: 0xc000012088
值类型:int
指针指向的值: 10

这里就要对比一下取地址操作符(&)和取值操作符(*)的区别。

  • &:取出地址;
  • *:根据地址取值。

接下来在实现一个通过指针修改值。

func main() {

	var vari1 int = 10

	fmt.Printf("变量地址:%x\n", &vari1)

	// 声明一个变量 ptr,用于存储变量地址
	ptr := &vari1

	// 对指针取值
	value := *ptr

	// 获取指针指向的值
	fmt.Println("修改前,指针指向的值:", value)

	// 修改指针 ptr 指向的值
	*ptr = 444

	// 获取指针指向的值
	fmt.Println("修改后,vari1 值:", vari1)
}

此时运行代码,发现通过 *ptr 已经成功修改了变量 vari1 的值。

这里唯一要琢磨的知识点是 * 操作符出现的位置,如果其出现在等号右侧,表示取指针的值,放到等号左侧,表示指针指向的变量

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。