前言
前面学习了Go数据类型中的数字、字符串,下面看看Go中是否有Python中的list、dict等复合数据类型?
需要注意的是在Go中数组是值类型,而切片是引用类型;
package main import "fmt" func main() { //声明1个字符串变量 var name string fmt.Println(name) //声明1个数组变量 var a1 [3]int fmt.Println(a1) //声明1个切片类型的变量 var s1 []int fmt.Println(s1 == nil) //声明二维数组 var a3 [3][3]int //对二维数组进行初始化 a3 = [3][3]int{ [3]int{1, 2, 3}, [3]int{4, 5, 6}, [3]int{7, 8, 8}, } fmt.Println(a3) // a4 := [3]int{1, 2, 3} a5 := modifyArry(a4) fmt.Println(a4) fmt.Println(a5) s2 := []string{"河北", "保定", "唐县"} s3 := modifySlice(s2) fmt.Println(s2) fmt.Println(s3) } //数组是值类型:修改数组时,会复制 1个新的数组让我们修改 func modifyArry(a1 [3]int) (ret [3]int) { a1[0] = 100 return a1 } //切片是引用类型:修改切片时,不会复制1个新的切片让我们修改(修改原来的) func modifySlice(s2 []string) (ret2 []string) { s2[0] = "河北省" return s2 }
数组
数组就是存放同1种数据基本数据类型(数值,字符、字符串、布尔值)元素的容器。
Go中的数组有一下特点:
在声明arry变量时就要声明arry的长度、容器内存放元素的数据类型;
数组的长度是数据类型的1部分,所以2个长度不同arrr,即使他们都属于数组,但2者的数据类型完全不一致,所以2者无法相互比较和赋值。
数组如果没有初始化里面的元素默认为0值(bool=false,int or float=0, string=空字符串)
数组的声明和初始化
package main import "fmt" func main() { //数组:存放同1中基础数据类型的容器 //声明1个长度为3的数组,里面存放bool数据类型 var arry1 [3]bool var arry2 [4]bool var arry3 [3]bool fmt.Printf("arry1:%T arry2:%T arry3:%T ", arry1, arry2, arry3) fmt.Println(arry1 == arry3) //初始化方式1: arry1 = [3]bool{true, true, true} fmt.Println(arry1) //[true true true] //初始化方式2:[...]自动推算数组的长度 arry4 := [...]int{1, 2, 3, 4} fmt.Println(arry4) //初始化方式3:利用默认值 arry5 := [5]int{12, 13} fmt.Println(arry5) //[12 13 0 0 0] //初始化方式4:根据索引指定arry中的元素 arry6 := [5]int{0: 1, 4: 6} fmt.Println(arry6)//[1 0 0 0 6] }
遍历数组
//遍历数组 package main import ( "fmt" ) func main() { //根据索引访问元素 var cities = [...]string{"北京", "上海", "深圳"} for i := 0; i < len(cities); i++ { fmt.Printf("%s ", cities[i]) } //遍历数组 for i, v := range cities { fmt.Println(i, v) } }
多维数组
多维数组就是数组里面嵌套数组
package main import ( "fmt" ) func main() { //定义多维数组 a1 := [3][2]int{{1, 2}, {1, 3}, {1, 4}} fmt.Println(a1) //[[1 2] [1 3] [1 4]] //遍历多维数组 for _, v := range a1 { for _, v1 := range v { fmt.Println(v1) } } }
Go中多维数组是数值类型不是引用类型
值类型:就是重新开辟新的内存,与引用类型相反
package main import ( "fmt" ) func main() { //arry数值类型辩证 a1 := [...]string{"河北", "河南", "山东"} a2 := a1 a1[len(a1)-1] = "山西" fmt.Println(a1) //[河北 河南 山西] fmt.Println(a2) //[河北 河南 山东] }
练习题
package main import ( "fmt" ) func main() { //1.求数组[1, 3, 5, 7, 8]所有元素的和 arr1 := [...]int{1, 3, 5, 7, 8} var sum int for _, v := range arr1 { sum += v } fmt.Println(sum) /*找出数组中和为指定值的两个元素的下标,比如从数组[1, 3, 5, 7, 8]中找出和为8的两个元素的下标分别为(0,3)和(1,2)*/ for i := 0; i < len(arr1); i++ { for j := i + 1; j < len(arr1); j++ { if arr1[i]+arr1[j] == 8 { fmt.Printf("%d %d ", i, j) } } } }