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值。

现的

  

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----------")
}