当前位置:网站首页>7 天能找到 Go 工作吗?学学 Go 数组和指针试试
7 天能找到 Go 工作吗?学学 Go 数组和指针试试
2022-08-04 14:32:00 【华为云】
学习之前
对于一个 Python 工程师来说,数组和指针在 Python 中都没有明确概念,所以这部分知识点只能依赖 C/C++的积累了。
学习数组的时候,可以参考 Python 的列表进行实践。
Go 数组
先看一下数组的定义,它是一个由固定长度的特定数据类型元素组成的序列,其中有两个关键点,其一是数组长度固定,其二是特定数据类型。
其语法结构如下:
var variable_name [SIZE] varuable_type// var 变量名 [元素长度/数量] 数据类型其中元素数量要求必须是整数类型,数据类型可以是任意基本类型,当然包括数组类型,该情况就会形成多维数组。
package mainimport "fmt"func main() { var a_array [3]int fmt.Println(a_array [0]) // 打印第一个元素 fmt.Println(a_array [1]) // 打印第二个元素}测试代码之后,会发现数组未初始化前,默认值就是数据类型的零值,对于数组也存在索引取值的问题,这点有其它语言的基础,很容易理解。
下面在看一下如何对数组进行初始化操作。
package mainimport "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 mainimport "fmt"func main() { a_array := [...]int{1, 2, 3} fmt.Printf("%T\n", a_array)}打印输出的 %T 表示输出类型。
数组一旦声明长度之后,无法修改,该知识点你可以用代码复现一下。
Go 指针
在 Go 中,取地址符是 &,使用 &var 就可以获取 var 的内存地址。
测试代码如下所示:
package mainimport "fmt"func main() { var vari1 int = 10 fmt.Printf("变量地址:%x\n", &vari1)}输出结果如下所示:
变量地址:c000012088Go 指针和 C 指针一样的概念,指针变量就是声明一个指向内存地址的变量。
在使用前,需要提前进行声明,格式如下:
var var_name *var_type其中 var_type 为指针类型,var_name 是指针变量名,特殊符号 * 标记指针。
例如我们声明一个整型指针,可以使用下述格式。
var int_ptr *int指针如果被声明但未被赋值,默认值是 nil,大家习惯指针的缩写是 ptr。
在 Go 中每个变量都有地址,指针的值就是地址。
接下来我们可以进行下面的这个实验,从指针获取【指针指向的值】,代码如下:
var vari1 int = 10fmt.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 的值。
这里唯一要琢磨的知识点是 * 操作符出现的位置,如果其出现在等号右侧,表示取指针的值,放到等号左侧,表示指针指向的变量。
边栏推荐
- How to write SQL statements: the usage of Update, Case, and Select together
- 谷歌插件.crx文件下载后被自动删除的解决方法
- 【 HMS core 】 【 Media 】 online video editing service 】 【 material can't show, or network anomalies have been Loading state
- 1375. 二进制字符串前缀一致的次数-前序遍历法
- 集合划分差最小问题(01背包)
- 【北亚数据恢复】IBM System Storage存储lvm信息丢失数据恢复方案
- Find My Technology | Prevent your pet from getting lost, Apple Find My technology can help you
- 小 P 周刊 Vol.13
- Cisco - Small Network Topology (DNS, DHCP, Web Server, Wireless Router)
- CCF GLCC正式开营|九州云开源专家携丰厚奖金,助力高校开源推广
猜你喜欢
随机推荐
js深拷贝和浅拷贝具体使用区别_es6深拷贝和浅拷贝
Redis 复习计划 - Redis主从数据一致性和哨兵机制
爬虫——selenium基本使用、无界面浏览器、selenium的其他用法、selenium的cookie、爬虫案例
如何在ubuntu环境下安装postgresql并配置远程访问
快解析结合千方百剂
Hangzhou electric the competition team arrangement (ACM)
C# 动态加载卸载 DLL
【模型部署与业务落地】基于量化芯片的损失分析
实际工作中的高级技术(训练加速、推理加速、深度学习自适应、对抗神经网络)
【Today in History】August 4: First female Turing Award winner; NVIDIA acquires MediaQ; first Cybersecurity Challenge completed
Keycloak 6.0.0 正式发布,身份和访问管理系统
Almost all known protein structures in the world are open sourced by DeepMind
Chinese valentine's day, of course, to learn SQL optimization better leave work early to find objects
【问题解决】QT更新组件出现 “要继续此操作,至少需要一个有效且已启用的储存库”
输入输出流总结
idea removes spark logs
代码随想录笔记_动态规划_1049最后一块石头的重量II
Technology sharing | Description of the electronic fence function in the integrated dispatching system
技术分享| 小程序实现音视频通话
CF1527D MEX Tree(mex&树&容斥)









