数组,切片和字典


数组

数组是一个具有相同数据类型的元素组成的固定长度有序集合。比如下面的例子

var x [5]int

表示数组x是一个整型数组,而且数值的长度为5。Go提供了几种不同的数组定义方法。

定义后初始化

数组元素定义后,初始值默认为零值

package main

import "fmt"

func main() {
 var x [5]int 
    // or var x =[5]int{}
 for i := 0; i < 5; i++ {
  x[i] = i
 }
 for i := 0; i < 5; i++ {
  fmt.Printf("x[%d] = %d\n", i, x[i])
 }
}

定义时初始化

package main

import "fmt"

func main() {
 var x = [5]int{0, 1, 2, 3, 4} //注意写法
 for i := 0; i < 5; i++ {
  fmt.Printf("x[%d] = %d\n", i, x[i])
 }
}

不带长度初始化

package main

import "fmt"

func main() {
 var x = [...]string{
  "a",
  "b",
  "c",
 }
    /* or
    var x = [...]string{
  "a",
  "b",
  "c"}
    */
 
 for i := 0; i < 3; i++ {
  fmt.Println(x[i])
 }
}

切片

切片可以看成是不定长的数组,需要注意的是,切片是引用类型。

创建切片

创建切片有几种方法

var x = []T{args}
var x = make([]T,len,cap)
var x = make([]T,len)
var x = A[l:r] //A 是一个数组,得到的x初始值为{a[l]...a[r-1]}

append

x = append(x,arg1,arg2....)
x = append(slice1,slice2...) //后面的三个点不可少,表示拆开

注意:切片会引用创建时候的底层数组,对切片的操作会直接作用在底层数组上,如果当前操作超过了底层数组的容量那么就会创建一个新的底层数组。这也就是为什么append一定要求接受返回值。

copy

copy(aim,source) //取min(len(aim),len(source))

删除

go中没有切片删除元素的内置函数,我们可以通过切片来完成

var x =[]int{1,2,3,4}
x = append(a[:i],a[i+1:]...) //删除第i个元素

排序

可以用sort包对切片进行排序,如果是数组要先转换为切片

package main

import (
 "fmt"
 "sort"
)

func main() {
 s := []int{5, 2, 1, 4, 3}
 sort.Ints(s[:])
 fmt.Println(s)
}

字典

创建字典

字典是引用类型,所以要声明指针后还要创建空间

创建带初始值的字典

var M = map[string]int{
    "A",1,
    "B",2,
    "C",3,
}

不带初始值的字典

var x = make(map[string]string)
x := make(map[string]string)

查询

查询的返回值有两个,valexist,如果不存在那么val为零值,existfalse

package main

import "fmt"

func main() {
 x := make(map[string]string)
 x["a"] = "A"
 if _, ok := x["b"]; !ok { 
  fmt.Print("Has not b")
 }
}

删除

Go提供了内置函数delete

package main

import "fmt"

func main() {
 x := make(map[string]string)
 x["a"] = "A"
 delete(x, "a")
 if _, ok := x["a"]; ok {
  fmt.Print("Has a")
 } else {
  fmt.Print("Has no a")
 }
} //Has no a

文章作者: ffacs
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ffacs !
  目录