前言
go有着数组和切片两种方式,数组一旦创建,长度就不可以被修改,但是切片,可以按需自动增长,自动扩容
go中的数组
go中的数组定义
css
package main
import "fmt"
func main() {
var a = [3]int{1, 2, 3}
a[0] = 1
a[1] = 2
a[2] = 3
fmt.Println(a)
}
这个时候,该数组是不能被扩容的,也就是不能使用append
增加数组元素
切片
切片的创建与初始化
可以在创建的时候,不指定长度
go
package main
import "fmt"
func main() {
var a = []int{1, 2, 3}
fmt.Println(a)
}
或者使用make
初始化
go
package main
import "fmt"
func main() {
var a = make([]int, 5)
fmt.Println(a)
}
也可以使用指定索引方式
css
package main
import "fmt"
func main() {
var a = []int{1: 1, 3: 3, 5: 5}
fmt.Println(a)
}
输出结果为
可以创建一个空的切片,但是如果数组下标超过切片,那么就会报错
css
package main
import "fmt"
func main() {
var a = []int{}
fmt.Println(a[0])
}
输出结果为

切片复制
css
package main
import "fmt"
func main() {
var a = []int{1, 2, 3, 4, 5, 6}
b := a[1:3]
fmt.Println(b)
}
输出结果为
复制索引1到3的元素, 注意新切片不包含索引为3的元素
css
package main
import "fmt"
func main() {
var a = []int{1, 2, 3, 4, 5, 6}
b := a[1:]
fmt.Println(b)
}
输出结果为
从索引1开始复制,到数组结束
css
package main
import "fmt"
func main() {
var a = []int{1, 2, 3, 4, 5, 6}
b := a[:3]
fmt.Println(b)
}
输出结果为
这里是从索引0开始复制,然后到索引2
备注
这里需要注意的是,复制出来的切片,修改元素的值,会影响原来切片的值
less
package main
import "fmt"
func main() {
var a = []int{1, 2, 3, 4, 5, 6}
b := a[1:]
fmt.Println(b)
b[0] = 10
fmt.Println(a)
}
输出结果为

append
可以使用append
增加切片数据
css
package main
import "fmt"
func main() {
var a = []int{1, 2, 3, 4, 5, 6}
a = append(a, 12)
fmt.Println(a)
}
输出结果为
新增多个元素
css
package main
import "fmt"
func main() {
var a = []int{1, 2, 3, 4, 5, 6}
a = append(a, 12)
var b = []int{1, 2, 3}
a = append(a, b...)
fmt.Println(a)
}
输出结果为

切片移除元素
可以使用切片移除元素
css
package main
import "fmt"
func main() {
var a = []int{1, 2, 3, 4, 5, 6}
a = append(a[:1], a[3:]...)
fmt.Println(a)
}
输出结果为

切片遍历
css
package main
import "fmt"
func main() {
var a = []int{1, 2, 3, 4, 5, 6}
for i := 0; i < len(a); i++ {
fmt.Println(a[i])
}
}
输出结果为

二维切片声明
css
package main
import "fmt"
func main() {
var a = [][]int{{1}, {2}}
fmt.Println(a)
}
输出结果为
或者使用
go
package main
import "fmt"
func main() {
var a = make([][]int, 3)
fmt.Println(a)
}
总结
go中的切片可以动态操作数据,还是可以方便使用