9.6 Go语言入门(数组、切片和指针)

2024-05-24 18:04

本文主要是介绍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语言入门(数组、切片和指针)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/999129

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就