当前位置: 首页 > news >正文

GO 语言学习 之 数组和切片

预告 : 切片主要有学习两种用法和应用示例

这里重点是切片,数组的化其实我们可能用到的不会太多,切片本质上是一个边长数组,所以这个应用比较防范,因为大多数情况下,我们都不能确定数组的长度,所以使用切片相对容易轻松了许多。

数组

定义:

var variable_name [SIZE]data_type

其中,variable_name 是数组的名称,SIZE是数组的大小,data_type是数组中元素的数据类型

  • 数组长度必须是常量,且是类型的组成部分,一旦创建,大小不可变。
  • 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。
  • 数组通过索引进行访问,从0到 len() - 1,超出范围会触发 painc
  • 数组是值类型,赋值和传参会传递一个一摸一样的副本,而不是指针,所以对副本的修改不会传递到原值
  • 数组支持多维数组

常见用法:

创建数组:

package mainimport "fmt"func main() {var a1 [5]int  // 声明一个包含 5 个整数的数组var a2 = [3]int{1, 2, 3}  // 初始化一个包含 3 个整数的数组a3 := [...]int{1, 2, 3, 4, 5}  // 根据元素数量自动推导出数组长度fmt.Println(a1)fmt.Println(a2)fmt.Println(a3)
}

数组的常见操作:

package mainimport "fmt"func print_array(array [5]int) {for i := 0;i < len(array);i++ {fmt.Println("print_array 输出数组元素 ", i, " 值为 ", array[i])}
}func main() {var a1 = [5]int {1,2,3,4,5}// 数组的长度fmt.Println("数组 a1 的长度 ", len(a1))// 遍历数组for i := 0;i < len(a1);i++ {fmt.Println("数组元素 ", i, " 值为 ", a1[i])}// 修改数组的内容a1[2] = 20fmt.Println("修改后数组的内容 : ", a1)// 函数实参print_array(a1)
}

切片

        切片的本质是一个结果体类型,他管理某一个数组类型,所以也算是引用类型。切片在作为参数或者赋值语句中,相当于值拷贝,结果是两个变量指向同一个数组。接着上面说,当遇到修改切片内容的时候,可能会触发扩容,一旦其中一个触发扩容后,这俩变量就不一样啦。切片作为一个变长数组使用,应该很容易理解了。

定义:

var variable_name []data_type

其中,variable_name 是数组的名称,[] 是类型的一部分不能省略,data_type是数组中元素的数据类型

切片是数组的引用,它并不存储数据,而是指向数组中的一个部分。

切片包含三个主要的部分:

  • 指针:指向数组中切片的第一个元素。

  • 长度:切片的元素个数。

  • 容量:切片所能容纳的最大元素数量,它是从切片的起始位置到数组末尾的元素数量。

切片的遍历和访问操作与数组相同,只是多了一个 cap(), 是数组的实际容量
切片的 零值 为 nil 

常见用法:

创建切片:

创建切片有三种方式:

  • 使用 []Type{} 直接创建切片
  • 使用 make 创建切片
  • 使用数组的切片操作创建切片
package mainimport "fmt"func main() {var a []intb := []int {1,2,3}c := make([]int, 3, 8)d := b[:2]e := b[0:]f := b[1:2]fmt.Println(a)fmt.Println(b)fmt.Println(c)fmt.Println(d)fmt.Println(e)fmt.Println(f)
}


s4 := make([]int, 0, 5)
s4 = append(s4, 1, 2, ...)
s4 = append(s4, s3...)

切片的常见操作:

  • 访问切片元素:
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println(a[0], a[1], a[4])
}
  • 切片的修改
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println("修改之前:", a)a[3] = 10fmt.Println("修改之后", a)
}
  • 向切片添加元素
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println("修改之前:", a)a = append(a, 6)fmt.Println("添加一个元素:", a)
}
  • 拷贝切片
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}b := make([]int, len(a))copy(b, a)  // 将 a 拷贝到 bfmt.Println("a 切片的内容:", a)fmt.Println("b 切片的内容:", b)
}
  • 切片的扩容
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}fmt.Println("a的长度 ", len(a), "a的容量 ", cap(a), "扩容之前的内容:", a)a = append(a, 6,7,8,9,10)fmt.Println("a的长度 ", len(a), "a的容量 ", cap(a), "扩容之后的内容:", a)
}
  • 遍历切片
package mainimport "fmt"func main() {a := []int {1,2,3,4,5}for i := 0; i < len(a); i++ {fmt.Println("第 ", i, "个元素:", a[i])}
}

http://www.lqws.cn/news/569953.html

相关文章:

  • Docker镜像制作案例
  • MATLAB中formattedDisplayText函数用法
  • 用户行为序列建模(篇八)-【阿里】DIEN
  • 由dbc文件解析can消息(一)
  • 信创背景下应用软件迁移解析:从政策解读到落地实践方案
  • 使用Xshell学习Linux的一些基本操作
  • JavaScript基础-常见网页特效案例
  • NumPy 统计函数与矩阵运算指南
  • 【大语言模型入门】—— 浅析LLM基座—Transformer原理
  • FPGA实现CameraLink视频解码,基于Xilinx ISERDES2原语,提供4套工程源码和技术支持
  • 【系统分析师】2021年真题:案例分析-答案及详解
  • SpringCloud系列(41)--SpringCloud Config分布式配置中心简介
  • 《从Backprop到Diffusion:深度学习的算法进化树全景图》
  • C++洛谷P1001 A+B Problem
  • 7类茶叶嫩芽图像分类数据集
  • 低延时高速数据链技术在无人平台(无人机无人船无人车)中的关键作用与应用
  • 2025年前端最新面试题及答案
  • S7-1200 CPU 与 S7-200 SMART S7通信(S7-1200 作为服务器)
  • 【算法设计与分析】(三)二分搜索技术与大整数乘法
  • Spring Cloud:分布式事务管理与数据一致性解决方案
  • stm32之普通定时器
  • C++并发编程-5.C++ 线程安全的单例模式演变
  • 从代码学习深度学习 - 自然语言推断:使用注意力 PyTorch版
  • burp suit使用
  • 自动化提示工程:未来AI优化的关键突破
  • mysql数据库完整备份导出
  • 板凳-------Mysql cookbook学习 (十--15)
  • Java面试宝典:基础四
  • 消息队列:Redis Stream到RabbitMQ的转换
  • allegro 铜皮的直角边怎么快速变成多边形?