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

【go从零单排】go中的三种数据类型array、slices、maps

挪威特罗姆瑟夜景

Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

array数组

package main

import "fmt"

func main() {

	var a [5]int //var关键字定义数组,[5]表示长度,int表示元素类型,不赋值时默认每个元素都是0
	fmt.Println("emp:", a)

	a[4] = 100 //给下标为4的元素(即第五个元素)赋值为100
	fmt.Println("set:", a)
	fmt.Println("get:", a[4])

	fmt.Println("len:", len(a))

	b := [5]int{1, 2, 3, 4, 5} //用:=自动判断b的类型,省略了var关键字,{}大括号给数组赋值
	fmt.Println("dcl:", b)

	b = [...]int{1, 2, 3, 4, 5} //和上面的区别是...不指定数组的长度,编译器会自动根据赋值的个数判断数组长度,并可以改变
	fmt.Println("dcl:", b)
	//使用3:400 这样的方式赋值时,中间的元素默认为0
	b = [...]int{100, 3: 400, 500} //3:400 是一种特殊的赋值方法,表示下标为3的元素赋值为400,500是下标为4的元素,b的长度是5
	fmt.Println("idx:", b)

	var twoD [2][3]int //二维数组,2行3列,记忆方法先横后竖
	for i := 0; i < 2; i++ {
		for j := 0; j < 3; j++ {
			twoD[i][j] = i + j
		}
	}
	fmt.Println("2d: ", twoD)

	twoD = [2][3]int{ //直接手写二维数组
		{1, 2, 3},
		{1, 2, 3},
	}
	fmt.Println("2d: ", twoD)
}

输出:

go run post.go
emp: [0 0 0 0 0]
set: [0 0 0 0 100]
get: 100
len: 5
dcl: [1 2 3 4 5]
dcl: [1 2 3 4 5]
idx: [100 0 0 400 500]
2d:  [[0 1 2] [1 2 3]]
2d:  [[1 2 3] [1 2 3]]

总结:

  • 这里注意二维数组的输出,[ [ …] [… ] ]都是中括号
  • 数组的数据类型必须相同 数组创建时制定长度,然后不可变
  • 数组创建时不指定长度,编译器自动判断长度

slices

Slices are an important data type in Go, giving a more powerful
interface to sequences than arrays.
slices 切片(翻译成中文有点怪怪的)是一种比array有更强大接口的序列。

package main

import (
	"fmt"
	"slices"
)

func main() {

	var s []string //var关键字定义s变量,用[]表示slice,string表示元素类型为字符串
	//nil是空值的意思 ,len(s)表示s的长度
	fmt.Println("uninit:", s, s == nil, len(s) == 0) //打印出uninit这个变量,==表示判断,结果是true或false

	s = make([]string, 3) //用make初始化一个slice初始值为零或空initially zero-valued,指定长度为3,容量默认和长度一样
	fmt.Println("emp:", s, "len:", len(s), "cap:", cap(s))
	//用下标给slice赋值,类似array
	s[0] = "a"
	s[1] = "b"
	s[2] = "c"
	fmt.Println("set:", s)
	fmt.Println("get:", s[2])

	fmt.Println("len:", len(s))
	//用append方法增加值到slice中,要赋值给一个变量
	s = append(s, "d")
	s = append(s, "e", "f")
	fmt.Println("apd:", s)
	//copy复制slice
	c := make([]string, len(s))
	copy(c, s) //注意copy的用法(新变量,被复制的变量),记忆:喜新厌旧,新的变量在前
	fmt.Println("cpy:", c)
	//slice的切片操作,类似python切片,前开后闭
	l := s[2:5]
	fmt.Println("sl1:", l)

	l = s[:5] //冒号前省略表示从第一个元素开始
	fmt.Println("sl2:", l)

	l = s[2:] //冒号后省略表示截取到最后一个元素
	fmt.Println("sl3:", l)
	//直接给slice赋值
	t := []string{"g", "h", "i"}
	fmt.Println("dcl:", t)

	t2 := []string{"g", "h", "i"}
	//slice.Equal比较是slice的值否相等
	if slices.Equal(t, t2) {
		fmt.Println("t == t2")
	}
	//二维切片
	twoD := make([][]int, 3) //创建了一个外部切片 twoD,其长度为3。这个外部切片将包含三个内部切片。
	for i := 0; i < 3; i++ { //外循环,循环外部切片
		innerLen := i + 1
		twoD[i] = make([]int, innerLen) //为外部切片中的每个位置创建一个内部切片,内部切片的长度由 innerLen 决定 1,2,3。
		for j := 0; j < innerLen; j++ { //内循环,循环内部切片
			twoD[i][j] = i + j //将值 i + j 赋给内部切片中的每个位置,这里的 i 表示外部切片的索引,j 表示内部切片的索引。
		}
	}
	fmt.Println("2d: ", twoD)
}

输出:

go run post.go
uninit: [] true true
emp: [  ] len: 3 cap: 3
set: [a b c]
get: c
len: 3
apd: [a b c d e f]
cpy: [a b c d e f]
sl1: [c d e]
sl2: [a b c d e]
sl3: [c d e f]
dcl: [g h i]
t == t2
2d:  [[0] [1 2] [2 3 4]]

对比array:

  • slice比array的接口要更多,Equal,copy等方法
  • 二维slice的创建需要多熟悉
  • slice是一种引用结构,是指向一个底层array
  • array在创建时就固定了类型和长度[5]int 和[10]int是两种类型
  • slice的长度可变,array长度不可变
  • array常用于处理固定长度的数据,slice处理可变长度的数据

map

package main

import (
	"fmt"
	"maps"
)

func main() {
	//关键字make(map)构造map,string为key类型,int为value类型
	m := make(map[string]int)
	//赋值
	m["k1"] = 7
	m["k2"] = 13

	fmt.Println("map:", m)

	v1 := m["k1"]
	fmt.Println("v1:", v1)

	v3 := m["k3"] //当value不存在时,默认是0
	fmt.Println("v3:", v3)

	fmt.Println("len:", len(m))
	//delete删除key
	delete(m, "k2")
	fmt.Println("map:", m)
	//clear清空map
	clear(m)
	fmt.Println("map:", m)
	//从map中获取的第二个参数可以返回该key是否存在于map中,这里我们只想知道是否存在,而不需要具体的值,用空符号“_”占位
	_, prs := m["k2"]
	fmt.Println("prs:", prs)
	//直接声明map并赋值
	n := map[string]int{"foo": 1, "bar": 2}
	fmt.Println("map:", n)

	n2 := map[string]int{"foo": 1, "bar": 2}
	//对比两个map的值是否相等
	if maps.Equal(n, n2) {
		fmt.Println("n == n2")
	}
}

输出:

go run post.go
map: map[k1:7 k2:13]
v1: 7
v3: 0
len: 2
map: map[k1:7]
map: map[]
prs: false
map: map[bar:2 foo:1]
n == n2

总结:

  • map类似python中的dict map中有第二个返回参数,可以知道该key是否存在于map
  • map中key不存在时默认返回0值
  • delete移除一个元素、clear清空ma跑、Equal对比是否相等
  • Println打印时以[k:v k:v] 的样式展示

掌握知识的最好方式就是教会别人,每篇文章都讲清楚一个知识点,欢迎留言我一起讨论。


http://www.kler.cn/a/384480.html

相关文章:

  • Android View事件分发
  • mac crontab 不能使用问题简记
  • 定时器入门:Air780E定时器基础与进阶
  • java获取当月所有时间
  • 基于Zynq FPGA的雷龙SD NAND存储芯片性能测试
  • 微服务架构面试内容整理-服务拆分的原则
  • 力扣排序455题(分发饼干)
  • 回归预测 | MATLAB实现BO-BiGRU贝叶斯优化双向门控循环单元多输入单输出回归预测
  • JavaEE初阶--servlet篇(三)HttpServlet/response/request对应方法使用
  • uniApp之uni-file-picker使用踩坑
  • 【C++】ROS:rosboard前端可视化工具配置使用
  • 登录鉴权 - 2024最新版前端秋招面试短期突击面试题【100道】
  • Python代码解析:处理JSON数据并导入Neo4j数据库
  • 基于卷积神经网络的农作物病虫害识别系统(pytorch框架,python源码)
  • 使用 Cypher 查询语言在 Neo4j 中查找最短路径
  • 需求分析管理
  • 【系统架构设计师】2023年真题论文: 论边云协同的设计与实现(包括解题思路和素材)
  • Dependency: androidx.webkit:webkit:1.11.0-alpha02. 问题
  • 【万字总结】数据结构常考应用大题做法画法详解_树_哈希表_图_排序大总结
  • 【金融风控】相关业务介绍及代码详解
  • (vue3)在Pinia Store中正确使用Vue I18n
  • 掌握Rust模式匹配:从基础语法到实际应用
  • HarmonyOS NEXT 应用开发实战(九、知乎日报项目详情页实现详细介绍)
  • 【MATLAB源码-第210期】基于matlab的OFDM电力线系统仿真,不同梳状导频间隔对比。三种信道估计,三种插值误码率对比
  • 市场营销应该怎么学?
  • SW - 将step中的输入实体转成零件