9.6 Go语言入门(数组、切片和指针)
Go语言入门(数组、切片和指针)
- 目录
- 五、数组、切片和指针
- 1. 数组
- 1.1 声明和初始化数组
- 1.2 访问和修改数组元素
- 1.3 多维数组
- 2. 切片
- 2.1 声明和初始化切片
- 2.2 访问和修改切片元素
- 2.3 切片操作
- 2.4 切片的追加和拷贝
- 3. 指针
- 3.1 声明和初始化指针
- 3.2 指针与函数
- 3.3 指针数组和数组指针
目录
Go 语言(Golang)是一种静态类型、编译型语言,由 Google 开发,专注于简洁性、并发和高效性。
下面是 Go 语言的基础语法讲解和代码示例。
上一篇:四、Go语言入门(条件语句和循环语句)
五、数组、切片和指针
在 Go 语言中,数组、切片和指针是非常重要的数据结构和概念。它们各自有不同的用途和特性,理解它们有助于编写高效和清晰的代码。下面详细讲解 Go 语言中的数组、切片和指针,并提供代码示例。
1. 数组
数组是固定长度的同类型元素的集合。数组的长度在声明时就确定了,之后不能改变。
1.1 声明和初始化数组
package mainimport "fmt"func main() {// 声明一个长度为 5 的整型数组,并初始化var arr1 [5]intfmt.Println(arr1) // 输出:[0 0 0 0 0]// 使用字面量初始化数组arr2 := [5]int{1, 2, 3, 4, 5}fmt.Println(arr2) // 输出:[1 2 3 4 5]// 部分初始化,未指定的元素使用默认值arr3 := [5]int{1, 2}fmt.Println(arr3) // 输出:[1 2 0 0 0]// 使用 ... 推断数组长度arr4 := [...]int{1, 2, 3}fmt.Println(arr4) // 输出:[1 2 3]
}
1.2 访问和修改数组元素
package mainimport "fmt"func main() {arr := [5]int{1, 2, 3, 4, 5}// 访问数组元素fmt.Println(arr[0]) // 输出:1// 修改数组元素arr[0] = 10fmt.Println(arr) // 输出:[10 2 3 4 5]
}
1.3 多维数组
package mainimport "fmt"func main() {// 声明一个 2x3 的二维数组var matrix [2][3]intfmt.Println(matrix) // 输出:[[0 0 0] [0 0 0]]// 初始化二维数组matrix = [2][3]int{{1, 2, 3}, {4, 5, 6}}fmt.Println(matrix) // 输出:[[1 2 3] [4 5 6]]
}
2. 切片
切片是一个动态数组,可以根据需要自动扩展。切片比数组更灵活,更常用。
2.1 声明和初始化切片
package mainimport "fmt"func main() {// 声明一个长度为 3 的整型切片,并初始化var s1 []intfmt.Println(s1) // 输出:[]// 使用字面量初始化切片s2 := []int{1, 2, 3, 4, 5}fmt.Println(s2) // 输出:[1 2 3 4 5]// 使用 make 函数创建切片s3 := make([]int, 5) // 创建长度为 5 的切片,元素初始值为 0fmt.Println(s3) // 输出:[0 0 0 0 0]// 创建一个长度为 3,容量为 5 的切片s4 := make([]int, 3, 5)fmt.Println(s4) // 输出:[0 0 0]
}
2.2 访问和修改切片元素
package mainimport "fmt"func main() {s := []int{1, 2, 3, 4, 5}// 访问切片元素fmt.Println(s[0]) // 输出:1// 修改切片元素s[0] = 10fmt.Println(s) // 输出:[10 2 3 4 5]
}
2.3 切片操作
切片支持切片操作符,允许从现有切片中创建新的切片。
package mainimport "fmt"func main() {s := []int{1, 2, 3, 4, 5}// 从索引 1 到索引 3 创建一个新的切片(不包括索引 3)s1 := s[1:3]fmt.Println(s1) // 输出:[2 3]// 省略开始索引表示从头开始s2 := s[:3]fmt.Println(s2) // 输出:[1 2 3]// 省略结束索引表示直到最后s3 := s[2:]fmt.Println(s3) // 输出:[3 4 5]// 完全省略表示整个切片s4 := s[:]fmt.Println(s4) // 输出:[1 2 3 4 5]
}
2.4 切片的追加和拷贝
使用 append 函数可以向切片中追加元素,使用 copy 函数可以拷贝切片。
package mainimport "fmt"func main() {s := []int{1, 2, 3}// 追加单个元素s = append(s, 4)fmt.Println(s) // 输出:[1 2 3 4]// 追加多个元素s = append(s, 5, 6, 7)fmt.Println(s) // 输出:[1 2 3 4 5 6 7]// 追加一个切片s2 := []int{8, 9}s = append(s, s2...)fmt.Println(s) // 输出:[1 2 3 4 5 6 7 8 9]// 拷贝切片s3 := make([]int, len(s))copy(s3, s)fmt.Println(s3) // 输出:[1 2 3 4 5 6 7 8 9]
}
3. 指针
指针是存储另一个变量的内存地址的变量。在 Go 中,指针可以用来传递大对象以避免拷贝,提高性能。
3.1 声明和初始化指针
package mainimport "fmt"func main() {var a int = 10// 声明一个指向 int 的指针var p *int// 将 a 的地址赋值给 pp = &a// 访问指针变量的值fmt.Println("Address of a:", p) // 输出:a 的地址fmt.Println("Value of *p:", *p) // 输出:10// 修改指针指向的值*p = 20fmt.Println("New value of a:", a) // 输出:20
}
3.2 指针与函数
指针可以作为函数参数,用于传递大对象以避免拷贝。
package mainimport "fmt"// 函数参数是一个指向 int 的指针
func updateValue(p *int) {*p = 200
}func main() {a := 100fmt.Println("Before:", a) // 输出:100// 将 a 的地址传递给函数updateValue(&a)fmt.Println("After:", a) // 输出:200
}
3.3 指针数组和数组指针
指针数组是包含指针的数组,数组指针是指向数组的指针。
package mainimport "fmt"func main() {// 指针数组arr1 := [3]*int{}a, b, c := 1, 2, 3arr1[0] = &aarr1[1] = &barr1[2] = &cfor i, p := range arr1 {fmt.Println(i, *p) // 输出:0 1, 1 2, 2 3}// 数组指针arr2 := [3]int{1, 2, 3}var p *[3]int = &arr2fmt.Println(p) // 输出:&[1 2 3]fmt.Println(*p) // 输出:[1 2 3]fmt.Println((*p)[1]) // 输出:2
}
通过理解数组、切片和指针,能够更好地处理复杂的数据结构和内存管理,提高程序的效率和性能。
相关文章:

9.6 Go语言入门(数组、切片和指针)
Go语言入门(数组、切片和指针) 目录五、数组、切片和指针1. 数组1.1 声明和初始化数组1.2 访问和修改数组元素1.3 多维数组 2. 切片2.1 声明和初始化切片2.2 访问和修改切片元素2.3 切片操作2.4 切片的追加和拷贝 3. 指针3.1 声明和初始化指针3.2 指针与…...

Web面试题(一)
一:以前公司的测试流程? (1)问题分析 面试官主要为了考察候选者对软件测试流程的理解和掌握程度。 (2)核心答案讲解 1)需求分析与评审 2ÿ…...

【Crypto】一眼就解密
文章目录 前言一眼就解密解题感悟 前言 Basic写累了,写写别的 一眼就解密 一眼md5试一试 小小flag 拿下! 解题感悟 30秒搞定...

虚拟ECU:彻底改变汽车软件开发与测试
汽车开发领域有着垂直性较强的一系列需求,其中最为瞩目的需求之一就是对安全高效的软件测试方法的需求。传统的汽车开发偏向使用硬件原型与真实ECU进行软件测试,但由于硬件设备往往在开发周期的中后阶段才生产完成,给汽车开发带来了成本与时间…...

【SQL Server001】SQLServer2016常用函数实战总结(已更新)
1.熟悉、梳理、总结下SQL Server相关知识体系。 2.日常研发过程中使用较少,随着时间的推移,很快就忘得一干二净,所以梳理总结下,以备日常使用参考 3.欢迎批评指正,跪谢一键三连! 总结源文件资源下载地址&am…...

51单片机简单控制180度舵机
代码: 链接:https://pan.baidu.com/s/1K9dg2NwRhy49db_O_hqv-g?pwd1234 提取码:1234 一、路线 我在了解这个舵机之前最像想看到的是一个完全的路径。 比如我想学习b站上那个智能门锁,那就得每个模块的基本代码都会才能结合各…...

PCL 常用小知识
文章目录 一、时间计算二、实现类似`pcl::PointCloud::Ptr`和`pcl::PointCloud`的两个类相互转换三、查找点云的x,y,z的极值四、知道需要保存点的索引,从原点云中拷贝点到新点云五、从点云里删除和添加点六、对点云进行全局或局部变换七、链接两个点云字段(两点云大小必须相…...

rbd块设备数据IO流程(client端)
一、rbd内核驱动写入流程 1)初始化 首先是rbd驱动的初始化工作:包括验证libceph的兼容性,分配内存,在sysfs中创建块设备控制文件、创建工作队列rbd_wq并调用INIT_WORK初始化它 module_init(rbd_init); static int __init rbd_i…...

数据仓库、数据中台、大数据平台之间的关系
数据行业经常会出现数据仓库、数据中台、大数据平台等概念,容易产生疑问,它们中间是相等,还是包含的关系? 数据中台和数据仓库概念的关系 数据中台概念是包含数据仓库的,数据仓库是数据中台中的一部分,包含…...

python写页面自动截图
from selenium import webdriver def take_screenshot(url, file_path):driver webdriver.Chrome()driver.get(url)driver.save_screenshot(file_path)driver.quit() if __name__ __main__:take_screenshot(http://baidu.com, D:\桌面\wang.png)要安装selenium还要安装google…...

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 空白项Spacer
博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 布局管理器 | 添加空白Spacer 文章编号:Qt 学…...

es问题汇总--待完善
1. 查询某个索引库中数据总量 方式一: CountRequest 鄙人喜欢这种方式 public long getTotalNum(String indexName) throws IOException {CountRequest countRequest new CountRequest(indexName);// 如果需要,你可以在这里添加查询条件// countReques…...

python 线性回归模型
教材链接-3.2. 线性回归的从零开始实现 c实现 该博客仅用于记录一下自己的代码,可与c实现作为对照 from d2l import torch as d2l import torch import random # nn是神经网络的缩写 from torch import nn from torch.utils import data# 加载训练数据 # 加载训…...

pcl::transformPointCloud()用法及注意事项
函数用法 #include <pcl/common/transforms.h> pcl::transformPointCloud(const pcl::PointCloud<PointT> &cloud_in, pcl::PointCloud<PointT> &cloud_out, const Eigen::Matrix4f &transform) 其中cloud_in, cloud_out的类型为pcl::PointClo…...

图像超分辨率重建相关概念、评价指标、数据集、模型
1、图像超分辨率概念 1.1 基本定义 超分辨率(Super-Resolution),简称超分(SR)。是指利用光学及其相关光学知识,根据已知图像信息恢复图像细节和其他数据信息的过程,简单来说就是增大图像的分辨…...

中移物联OneMO Cat.1模组推动联网POS规模应用
在第三方支付蓬勃发展和消费模式不断革新的时代背景下,新型联网POS终端以其智能化、便捷化的特点丰富人们生活便利度。在这一变革浪潮中,中移物联OneMO Cat.1模组ML307R凭借其卓越的性能和成本效益,成为推动联网POS规模应用的重要力量。 性能…...
二.常见算法--贪心算法
(1)单源点最短路径问题 问题描述: 给定一个图,任取其中一个节点为固定的起点,求从起点到任意节点的最短路径距离。 例如: 思路与关键点: 以下代码中涉及到宏INT_MAX,存在于<limits.h>中…...

LabVIEW高温往复摩擦测试系统中PID控制
在LabVIEW开发高温往复摩擦测试系统中实现PID控制,需要注意以下几个方面: 1. 系统建模与参数确定 物理模型建立: 首先,需要了解被控对象的物理特性,包括热惯性、摩擦系数等。这些特性决定了系统的响应速度和稳定性。实验数据获取…...

配置yum源
以下是在 Linux 系统中配置新的 yum 源的一般步骤和命令示例(以 CentOS 系统为例): 备份原有 yum 源配置文件:mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 创建新的 yum 源配置文件(…...

深入理解数仓开发(二)数据技术篇之数据同步
1、数据同步 数据同步我们之前在数仓当中使用了多种工具,比如使用 Flume 将日志文件从服务器采集到 Kafka,再通过 Flume 将 Kafka 中的数据采集到 HDFS。使用 MaxWell 实时监听 MySQL 的 binlog 日志,并将采集到的变更日志(json 格…...

C++语言学习(六)—— 类与对象(二)
目录 一、对象数组 二、对象指针 三、this 指针 四、类类型作为参数类型的三种形式 4.1 对象本身作为参数 4.2 对象指针作为参数 4.3 对象引用作为参数 五、静态成员 5.1 静态数据成员 5.2 静态成员函数 六、友元机制 6.1 友元函数 6.2 友元类 七、类的组合 八、…...

3d选择模型后不能旋转什么原因?怎么解决?---模大狮模型网
在3D建模和渲染的过程中,旋转模型是常见的操作。然而,有时在选择了模型后,却发现无法进行旋转,这可能会让许多用户感到困扰。本文将探讨3D选择模型后不能旋转的可能原因,并提供相应的解决方法。 一、3D选择模型后不能旋…...

从入门到精通:详解Linux环境基础开发工具的使用
前言 在这篇文章中,我将深入学习和理解Linux环境基础开发工具的使用。无论你是初学者还是有一定经验的开发者,相信这篇文章都会对你有所帮助。我们将详细讲解软件包管理器、编辑器、编译器、调试器、自动化构建工具以及版本控制工具的使用。 Linux软件…...

linux(centos 7)安装 node
linux(centos 7)安装 node 下载对应版本&安装解压配置环境变量使配置文件生效验证是否安装成功附加 目前node最新版本是 node-v22.0.0 官网下载地址:https://registry.npmmirror.com/binary.html?pathnode/latest-v22.x/node-v22.0.0-li…...

C++之第九课
课程列表 今天,我们要学习一种结构:循环结构。 循环的方法有3种。 今天先将第1种for学了: int a;//循环变量 int b; for(a1;a<10;a){//像if那样“打包”cout<<a<<" ";b; } 当然,也可以这样写&#…...

618精选编程书单推荐:优质知识提升你的代码力
前言 在这个快速发展的技术时代,不断学习和提升自己的编程技能是每位程序员的必修课。今天,我为大家精心挑选了一系列编程技术书籍,它们将是你技术成长道路上的宝贵财富。 文章目录 前言编程之路:为何阅读书籍是不可或缺的书籍的…...

使用httpx异步获取高校招生信息:一步到位的代理配置教程
概述 随着2024年中国高考的临近,考生和家长对高校招生信息的需求日益增加。了解各高校的专业、课程设置和录取标准对于高考志愿填报至关重要。通过爬虫技术,可以高效地从各高校官网获取这些关键信息。然而,面对大量的请求和反爬机制的挑战&a…...

使用Java Stream API的map方法将包含Long类型ID的流转换为String数组
在这个例子中,idList是一个包含Long类型ID的列表。我们使用stream()方法创建一个流,然后应用map(String::valueOf)方法将Long类型的ID转换为String类型。最后,我们使用toArray(String[]::new)方法将流中的元素收集到一个新的String[]数组中。…...

centos 安装nginx 并配置https ssl
进入你要安装的目录 一般是/usr/local/ wget https://nginx.org/download/nginx-1.24.0.tar.gz解压安装包:使用以下命令解压下载的Nginx安装包: tar -zxvf nginx-1.24.0.tar.gz在编译和安装Nginx之前,确保您的系统上已安装了必要的编译工具和…...