go基础三 数组,切片,map,list
数组:
1、Go 语⾔言提供了了数组类型的数据结构。 数组是具有相同类型的⼀一组⻓长度固定的数据序列列,这种类型可以是任意的基本数据类型或复合数据类型及⾃自定义类Go内置容器器——数组和切⽚片型。
2、数组元素可以通过索引下标(位置)来读取或者修改元素数据。索引从0开始,第⼀一个元素索引为 0,第⼆二个索引为 1,以此类推。数组的下标取值范围是从0开始,到⻓长度减1。
3、数组⼀一旦定义后,⼤大⼩小不不能更更改。
声明:
func main() {
a := [4]float64{67.7, 89.8, 21, 78}
b := [...]int{2, 3, 5}
// 遍历数组⽅方式 1
for i := 0; i < len(a); i++ {
fmt.Print(a[i], "\t")
}
fmt.Println()
// 遍历数组⽅方式 2
for _, value := range b {
fmt.Print(value, "\t")
}
}
切片:
Go 数组的⻓长度不不可改变,在特定场景中这样的集合就不不太适⽤用,Go中提 供了了⼀一种灵活,功能强悍的内置类型切⽚片("动态数组");
与数组相⽐比切⽚片的⻓长度是不不固定的,可以追加元素,在追加时可能使切⽚片 的容量量增⼤大。
切⽚片本身没有任何数据,它们只是对现有数组的引⽤用。 切⽚片与数组相⽐比,不不需要设定⻓长度,在[]中不不⽤用设定值,相对来说⽐比较⾃自 由 从概念上⾯面来说slice像⼀一个结构体,这个结构体包含了了三个元素: 指针,指向数组中slice指定的开始位置 ⻓长度,即slice的⻓长度 最⼤大⻓长度,也就是slice开始位置到数组的最后位置的⻓长度
func main() { var x = make([]int,3,5) fmt.Printf("%T\n" , x) fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x) }
map
map是Go中的内置类型,它将⼀一个值与⼀一个键关联起来。可以使⽤用相应的键检索值。有资料料翻译成地图、映射或字典。但是⼤大多数习惯上翻译成集合。
map 是⼀一种⽆无序的键值对(key-value pair )的集合。map通过 key 来快速检索数据,key 类似于索引,指向相应的value值。
map 是⼀一种集合,所以可以像遍历数组或切⽚片那样去遍历它,不不过map是⽆无序的,所以⽆无法决定它的展示顺序,这是因为 map 是使⽤用 hash 表来实现的
var country = map[string]string{ "China": "Beijing", "France": "Paris", "Italy": "Rome", "Japan": "Tokyo", //"Japan": "Tokyo2" , //key 名不不能重复 }
package main import "fmt" func main() { a :=make(map[string]string) a["a"]="a" a["b"]="b" for i,v :=range a{ fmt.Println(i,v) } delete(a,"a") for i,v :=range a{ fmt.Println(i,v) } a["a"]="c" for i,v :=range a{ fmt.Println(i,v) } }
list :
1、通过container/list包的New⽅方法声明list 变量量名 := list.New()
2、通过var声明list var 变量量名 list.List list与切⽚片和map不不同,没有具体元素类型的限制。list中的元素可以是任 意类型。 在CPP⾥里里⾯面,list的成员必须是同⼀一个数据类型,但是Go语⾔言中却允许list 中插⼊入任意类型的成员。 建议使⽤用New()实现声明list
package main import ( "fmt" "container/list" ) func main() { copyList() } //list 是值类型,不不过采⽤用 New ()⽅方法声明的是⼀一个指针。所以在拷⻉贝操作和 //参数传递时具有引⽤用类型的特征。 func copyList() { // 声明 list1copyList() list1 := list.New() printListInfo2("刚声明的list1:", list1) // 给 list1 赋值 list1.PushBack("one") list1.PushBack(2) list1.PushBack("three") list1.PushFront("first") printListInfo2("赋值后的list1", list1) iterateList2(list1) // 将 list1 拷⻉贝给 list2 。其实拷⻉贝的是地址 list2 := list1 printListInfo2("刚拷⻉贝的list2", list2) iterateList2(list2) //list2 修改后 list2.PushBack(250) list2.PushBack(350) list2.PushBack(450) printListInfo2("修改后的list2", list2) iterateList2(list2) //list2 的修改是否影响到 list1 ? printListInfo2("修改list2的list1", list1) iterateList2(list1) } func printListInfo2(info string, l *list.List) { fmt.Println(info + "----------") fmt.Printf("%T:%v \t , ⻓长度为:%d \n", l, l, l.Len()) fmt.Println("----------") } func iterateList2(l *list.List) { i := 0 for e := l.Front(); e != nil; e = e.Next() { i++ fmt.Printf("%d:%v \t", i, e.Value) } fmt.Println("\n----------") }