前言
前面学习了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)
}
}
}
}