go语言中数组与切片的区别


1、初始化:数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变 

//var a [...]int = [...]int{1, 2, 3} //error
a := [...]int{1, 2, 3}
var a2 [3]int = [3]int{4, 5, 6}



2、切片不需要指定大小

var s []int = []int{1, 2, 3, 4}


3、函数传递:

数组需要明确指定大小,切片不需要。数组是值传递,切片是地址传递


package main

import "fmt"

func changeArray(a [3]int) {
a[0] = 100
}

func changeSlice(s []int) {
s[0] = 100
}

func main() {
//var a [...]int = [...]int{1, 2, 3} //error
a := [...]int{1, 2, 3}
changeArray(a)
fmt.Println(a[0]) //值传递

var a2 [3]int = [3]int{4, 5, 6}
a2[2] = 77
var s []int = []int{1, 2, 3, 4}

fmt.Println(len(s), cap((s)))
s = append(s, 6, 7, 8)
fmt.Println(len(s), cap(s))

changeSlice(s)
fmt.Println(s[0]) //地址传递
}


结果:

1
4 4
7 8
100

成功: 进程退出代码 0.



多变量传递,结尾三个点使用

如果你在slice已经有多个参数,将其应用到一个复杂的函数func(slice...)。


func sum(nums ...int) {
}

func main() {
    nums := []int{1, 2, 3, 4}
    sum(nums...)
}


go select 语法介绍

1、select 默认是阻塞方法,可以同时接收多个channel;

2、如果select中,有time.After(3 * time.Second),可以实现超时,3秒后超时;

3、如果select中,有default选择,将变为非阻塞方法;


没有登录不能评论