数组和切片

数组

数组是指同一类型元素的集合。

1.数组的定义及赋初值

package main
import "fmt" func main() { var a [3]int # 定义了一个长度为三的int类型数组 fmt.Println(a) # 运行结果:[0,0,0] ----------------------------------------------------------------- # 定义并赋值初值 var a [6]int = [6]int{1, 2, 3, 4, 5, 6} # >>>:[1, 2, 3, 4, 5, 6] var a = [6]int{1, 2, 3} # >>>:[1, 2, 3, 0, 0, 0] a := [6]int{1, 2, 3} # >>>:[1, 2, 3, 0, 0, 0] a := [...]int{1,2,3} # 忽略数组的长度,用...来代替,编辑器会自动生成长度。 a[5] = 100 fmt.Println(a) ----------------------------------------------------------------- # 将第7个位置设置为666 a := [10]int{1, 2, 5: 666, 6: 777} # [1 2 0 0 0 666 777 0 0 0] a[-7] = 13 # 不支持负索引 }

 2.数组的长度

package main
import "fmt" func main() { a:=[4]int{1,2,3} fmt.Println(len(a)) # >>>:4 内置函数len() } &&与 ; ||或 ; !非

3.使用range迭代数组

  通过for循环的range方法来遍历数组。range返回索引和该索引处的值。语法为:for i, v := range a 。如果只需要值并希望忽略掉索引,则可通过 _ 空白表示怀疑替换索引。

package main

import "fmt"

func main() {
    var a [4]int=[4]int{1,2}
    for i :=0; i<len(a); i++{
        fmt.Println(a[i])
    }
}
------------------------------------------

func main() {
    var vv [5]int = [5]int{1, 2: 666, 3: 777}
    for _, v :=range vv {        # 只取值,不取索引
fmt.Println(_, v) } }

4.多维数组

package main
import "fmt" func main() { var a [5][2]int # 把一个数组分为五份,再对这五份进行细分,每份里面再分为两份。 a[0][1] = 100 # 从五份中选取索引0,再充索引0对应的那个两份中,选取索引1。 fmt.Println(a) # >>>: [[0 100] [0 0] [0 0] [0 0] [0 0]] }

切片

切片本身不存储数据,只是对底层数组的引用

1.切片的定义方式

package main

import "fmt"

#由数组切出来
func main() {
  var a [8]int = [8]int{1,2,3,4,5,6,7,8}
  var b []int = a[2:6]   # 打印出来的是前闭后开区间
  #[ ]内不加东西就是切片,[ ]加了东西便是数组类型
  fmt.Println(b)
  a[2] = 30
  fmt.Println(b)
  fmt.Println(a) # 底层数组的修改会影响到切片,切片的修改也会影响到切片
}
---------------------------------------------------------
#更多用法
func main() {
  var a[8]int = [8]int{1,2,3,4,5,6,7,8}
  b := a[ :4]  # go中的切片没有步长
  fmt.Println(b)
}
---------------------------------------------------------
# 直接定义
# 切片空值? 其实就是个地址 ,nil类型
func main() {
    var a []int
    if a == nil {
        fmt.Println("我是空值")
    }
    fmt.Println(a)      
}

2.定义并初始化

# 参数类型,第一个数字是切片的长度,第二个是底层数组的长度,也就是切片长度。
package main

import "fmt"
   
func main() {
  var a []int = make([]int,3,4
  fmt.Println(a)
}

3.切片的长度和容量

package main

import "fmt"
   
func main() {
    var a [8]int = [8]int {1,2,3,4,5,6,7,8} 
    var b []int = a[2:6] fmt.Println(len(b))   # 切片的长度 >>>:4         
    fmt.Println(cap(b))   # 切片的容量 ,来确定能放多少值 >>>:6
}

 4.追加切片元素

package main

import "fmt"

func main() {
    var a [8]int = [8]int {1,2,3,4,5,6,7,8}
    var b []int = a[2:6]
    fmt.Println(b)
    fmt.Println(a)
    fmt.Println(len(b))   # 查数组的长度
    fmt.Println(cap(b))  # 查数组的容量 
--------------------------------------------------------
    #切片一直追加值,当追加到数组长度时,就不依附于底层数组,重新生成了一个数组,数组大小为切片容量的两倍。
    #内置函数append
    b=append(b,555)
    b=append(b,66)
    b=append(b,77)
    
    fmt.Println(len(b))   # 数组想扩容,要重新再申请一个数组
    fmt.Println(cap(b))   # 容量一旦超出,再重新申请一个跟原来一样的,容量翻倍
    fmt.Println(a)
    fmt.Println(b)
    b[0]=999
    fmt.Println(a)
}

 5.切片的修改

package main

import "fmt"

func main() {
    var a [8]int = [8]int {1,2,3,4,5,6,7,8}
    var b  = make([]int,3,4)
    b[0]=99     # 将b数组中索引0对应的值改为99
    fmt.Println(b)
}

6.切片删除元素

package main

import "fmt"

func main() {
        var a = []int{1,2,3,4,5,6}
    fmt.Println(a)      # >>>:[1 2 3 4 5 6]
    a = append(a[0:2],a[3:]...)  #只取[0:2]和[3:]之间的索引,...表示打散
    fmt.Println(a)    # >>>:[1 2 4 5 6]
}

7.多维切片初始化方法

package main

import "fmt"

func main() {
    var a []int=[]int{1,2,3}   # 切片初始化方法
    fmt.Println(a)

    var a [][]string=[][]string{{"1","20"},{"3","40"}} #多维切片初始化方法 
    fmt.Println(a)   # >>>: [[1 20] [3 40]]
    fmt.Println(len(a))  # 查看长度
    fmt.Println(cap(a))  # 查看容量
    a[0][1] = "222" 
        a[1][1] = "444" 
    fmt.Println(a)     # >>>: [[1 222] [3 444]]
}

 8. copy函数

package main

import "fmt"

func main() {
    var a=make([]int,3,10)
    a[1] = 66
    a[2] = 77
    fmt.Println(a)  
    
    var b=make([]int,4,4)
    fmt.Println(b)     # copy(目标切片, 原切片)
    copy(b,a)     # 把 a的值 copy到 b 切片上去
    fmt.Println(b)
}
原文地址:https://www.cnblogs.com/blue-tea/p/12030070.html