写点什么

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

作者:梦想橡皮擦
  • 2022 年 8 月 19 日
    河北
  • 本文字数:1561 字

    阅读完需:约 5 分钟

学习之前

对于一个 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])}
复制代码


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


50
复制代码


第二个数组变量 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 := *ptrfmt.Printf("值类型:%T\n", value)
// 获取指针指向的值fmt.Println("指针指向的值:", value)
复制代码


输出内容如下所示:


变量地址:c000012088ptr 类型:*intptr 值: 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 的值。


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

发布于: 刚刚阅读数: 5
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
7 天能找到 Go 工作吗?学学 Go 数组和指针试试_Python_梦想橡皮擦_InfoQ写作社区