package main
import"fmt"funcmain(){//定义了一个大小为3的int类型数组//数组在定义阶段,大小和类型就固定了var a [3]int//只定义,没有初始化
fmt.Println(a)}//[0 0 0]
2、使用数组
package main
import"fmt"funcmain(){var a [3]int
a[2]=100//修改赋值
fmt.Println(a)
fmt.Println(a[0])//取0的位置}//[0 0 100]//0
3、定义并赋值
package main
import"fmt"funcmain(){//方式一var a [3]int=[3]int{1,2,3}//[1 2 3]//方式二var a =[3]int{1,2,3}//[1 2 3]//方式三
a :=[3]int{1,2,3}//[1 2 3]//只给第2个位置设为99
a :=[3]int{2:99}//[0 0 99]//指定位置设置
a :=[3]int{2:99,1:88}//[0 88 99]
fmt.Println(a)}
4、数组的大小是类型的一部分
package main
import"fmt"funcmain(){//这两个不是一个类型var a [2]intvar b [3]int
a=b
fmt.Println(a>b)}
5、数组是值类型(当参数传递到函数中,修改不会改变原来的值)
// go语言中,都是copy传递/*
python中都是引用传递,一切皆对象,就是地址,当做参数传递是把地址传过去了
python中比较特殊:可变类型和不可变类型
*/package main
import"fmt"funcmain(){var a [3]int=[3]int{5,6,7}
fmt.Println(a)//[5 6 7]test1(a)
fmt.Println(a)//[5 6 7]}functest1(a [3]int){
a[0]=999
fmt.Println(a)//[999 6 7]}
6、数组长度
package main
import"fmt"funcmain(){var a [3]int=[3]int{5,6,7}
fmt.Println(len(a))//3}
7、循环数组
package main
import"fmt"funcmain(){//方式一var a [3]int=[3]int{5,6,7}for i:=0;i<len(a);i++{
fmt.Println(a[i])}//方式二//range:是一个关键字var a [3]int=[3]int{5,6,7}for i,v:=range a{
fmt.Println(i)//索引
fmt.Println(v)//数组的值}//方式三//函数如果返回两个值,必须用两个值来接收//range可以用一个值来接收,如果用一个值来接收,就是索引var a [3]int=[3]int{5,6,7}for i:=range a{
fmt.Println(i)//索引}//方式四//只取值,不取索引var a [3]int=[3]int{5,6,7}for_,v:=range a{
fmt.Println(v)//值}}
8、多维数组
package main
import"fmt"funcmain(){//定义一个二维数组var a [3][2]int// [[0 0] [0 0] [0 0]]//定义并初始化var a [3][2]int=[3][2]int{{1,2},{4,5},{9,70}}
a[1][0]=999//修改值
fmt.Println(a)// [[1 2] [999 5] [9 70]]}
a :=make([]int,3)//长度3,容量3package main
import"fmt"funcmain(){//var a []int//切片零值是什么? nil类型:是所有引用类型的空值//fmt.Println(a)//if a==nil{// fmt.Println("我是空的")//}//3是长度,4是容量//var a []int=make([]int,3,4) //[0 0 0]//3是长度,3是容量var a []int=make([]int,3)//[0 0 0]
a :=make([]int,3)//第二种
fmt.Println(a)
fmt.Println(len(a))//3
fmt.Println(cap(a))//3
a=append(a,55)// [0 0 0 55]
fmt.Println(a)
fmt.Println(len(a))//4
fmt.Println(cap(a))//6}
7、切片定义并赋初值
package main
import"fmt"funcmain(){var a []int=[]int{1,2,3}
fmt.Println(a)//[1 2 3]
fmt.Println(len(a))//3
fmt.Println(cap(a))//3}
8、切片是引用类型,当参数传递,会修改掉原来的值
package main
import"fmt"funcmain(){var a []int=[]int{1,2,3}
fmt.Println(a)// [1 2 3]test3(a)
fmt.Println(a)// [999 2 3]}functest3(a []int){
a[0]=999
fmt.Println(a)// [999 2 3]}
9、多维切片
package main
import"fmt"funcmain(){var a [][]int=make([][]int,2,3)
fmt.Println(a)//[[] []]
fmt.Println(a[0]==nil)//true//会报错//a[0][0]=999// 如何做?(for循环完成初始化)
a[0]=make([]int,2,3)
a[0][1]=999
fmt.Println(a)//[[0 999] []]
a[1][0]=99999//////定义并赋初值用的多//var a [][]int=[][]int{{1,2,3},{4,5,6,7,7,8}}//////跟上面不一样//var a [][3]int=[][3]int{{1,2,3},{4,5,6}}//fmt.Println(a)}
10、切片的copy
package main
import"fmt"funcmain(){var a []int=make([]int,3,4)var b []int=make([]int,2,6)
fmt.Println(a)//[0 0 0]
fmt.Println(b)//[0 0]
a[0]=11
a[1]=22
a[2]=33
b[0]=999
fmt.Println(a)// [11 22 33]
fmt.Println(b)// [999 0]copy(b,a)//拷贝,把a拷给b,多余的截断
fmt.Println(b)// [11 22]}
1.将切片 b 的元素追加到切片 a 之后: a =append(a, b...)2.删除位于索引 i 的元素: a =append(a[:i], a[i+1:]...)3.切除切片 a 中从索引 i 至 j 位置的元素: a =append(a[:i], a[j:]...)4.在索引i位置插入元素:
nums1 :=[]int{1,2,3,4}
nums1 =append(nums1[:2],append([]int{66}, nums1[2:]...)...)
fmt.Println(nums1)//[1 2 66 3 4]5.在索引i位置插入切片:
nums1 :=[]int{1,2,3,4}
nums2 :=[]int{66,66,66}
nums1 =append(nums1[:2],append(nums2, nums1[2:]...)...)
fmt.Println(nums1)//[1 2 66 66 66 3 4]6.在头部位置插入元素:
a :=[]int{1,2,3}
a =append([]int{66}, a...)
fmt.Println(a)//[66 1 2 3]7.在头部位置插入切片:
a :=[]int{1,2,3}
a =append([]int{66,77}, a...)
fmt.Println(a)//[66 77 1 2 3]8.弹出切片末尾的元素:
nums1 :=[]int{1,2,3,4}
x, nums1 := nums1[len(nums1)-1], nums1[:len(nums1)-1]
fmt.Println(x)//4
fmt.Println(nums1)//[1 2 3]9.弹出切片头部的元素:
nums1 :=[]int{1,2,3,4}
x, nums1 := nums1[0], nums1[1:]
fmt.Println(x)//1
fmt.Println(nums1)//[2 3 4]
13、copy
复制切片 a 的元素到新的切片 b 上:
nums1 :=[]int{1,2,3,4}
b :=make([]int,len(nums1))copy(b, nums1)
fmt.Println(b)
Maps
//maps:hash,字典, key:value存储
1、map的定义和使用
package main
import"fmt"funcmain(){//map[key类型]value类型:key的类型必须可hash,key值:数字,字符串//map的零值:nil 它是一个引用类型var a map[int]string
a :=make(map[int]string)
fmt.Println(a)//map[]if a==nil{
fmt.Println("我是空的")// 我是空的}}
2、创建map
dic :=make(map[string]string)//方式一var dic map[int]string=make(map[int]string)//方式二
dic :=map[string]string{"pwd":"123445"}//方式三package main
import"fmt"funcmain(){//var a map[int]string//初始化用makevar a map[int]string=make(map[int]string)//如果有,会修改,如果没有,会放入
a[1]="lqz"// 设值
a[1]="jeff"//覆盖
a[2]="18"//a["xx"] key值不能乱写
fmt.Println(a)//map[1:jeff 2:18]}
3、获取元素
package main
import"fmt"funcmain(){var a map[int]string=make(map[int]string)//var a map[int]int=make(map[int]int)
fmt.Println(a[0])//取出value值的空值 ""
fmt.Println(a)// map[]}
4、判断value值是否存在
package main
import"fmt"funcmain(){//统一的方案来判断value值是否存在//a[0] 可以返回两个值,一个是value值(可能为空),另一个是true或falsevar a map[int]int=make(map[int]int)
a[0]=0
v,ok:=a[0]
fmt.Println(v)//0
fmt.Println(ok)//true}
5、map删除元素
package main
import"fmt"funcmain(){var a map[int]int=make(map[int]int)
a[1]=11
a[2]=22
fmt.Println(a)//map[1:11 2:22]//根据key删(内置函数)delete(a,1)
fmt.Println(a)//map[2:22]}
6、map长度
package main
import"fmt"funcmain(){var a map[int]int=make(map[int]int)
fmt.Println(len(a))//0
a[1]=11
a[2]=22
fmt.Println(len(a))//2}
7、map 是引用类型
package main
import"fmt"funcmain(){var a map[int]int=make(map[int]int)
a[1]=11
fmt.Println(a)// map[1:11]test(a)//证明是引用类型,相互改变
fmt.Println(a)// map[1:999]}functest(a map[int]int){
a[1]=999
fmt.Println(a)//map[1:999]}
8、map的相等性
//和python的字典差不多,只能按key取值后比较package main
import"fmt"funcmain(){var a map[string]string=make(map[string]string)
a["name"]="lqz"var b map[string]string=make(map[string]string)
b["name"]="lqz"
fmt.Println(a)
fmt.Println(b)//不能这样判断,map只能跟nil比较if a["name"]==b["name"]{
fmt.Println("相等")}}
9、循环map
//range循环
package main
import"fmt"
func main(){
var a map[string]string=map[string]string{"name":"lqz","age":"19","sex":"男"}for k,v:=range a{
fmt.Println(k)//key
fmt.Println(v)//value
}}//map是无序的(python中字典从3.6以后有序了,3.6之前无序,底层如何实现的)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南