slice概念
数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求。Go语言提供了数组切片(slice)来弥补数组的不足。
切片并不是数组或数组指针,它通过内部指针和相关属性引用数组片段,以实现变长方案。
slice 并不是真正意义上的动态数组,而是一个引用类型。slice 总是指向一个底层 array,slice的声明也可以像 array 一样,只是不需要长度。
- 【low:high:max】长度为high-low,容量为max-low
切片和数组的区别
- 数组
[]
里面的长度是固定的一个常量,数组不能修改长度, len和cap永远都是[]
里面规定的。 - 切片
[]
里面为空,或者为…,切片的长度或容量可以不固定。
切片的创建
- 自动推导类型
- 借助make函数,格式
make(切片类型,长度,容量)
,没有指定容量的话,容量和长度一样。
切片的截取
切片和底层数组
切片并不是数组或数组指针,它通过内部指针和相关属性引用数组片段,以实现变长方案。
切片内建函数
append
在原切片的末尾添加元素
append 函数会智能地底层数组的容量增长,一旦超过原底层数组容量,通常以2倍容量重新分配底层数组,并复制原来的数据。
copy
函数 copy 在两个 slice 间复制数据,复制长度以 len 小的为准,两个 slice 可指向同一底层数组。
切片做函数参数
- 只能以引用的方式进行传递
猜数字游戏
package main
import (
"fmt"
"math/rand"
"time"
)
func CreatNum(p *int) {
//设置种子,只需要一次
rand.Seed(time.Now().UnixNano())
var num int
for {
num = rand.Intn(10000)
if num >= 1000 {
break
}
}
*p = num
}
func GetNum(s []int, num int) {
s[0] = num / 1000
s[1] = num % 1000 / 100
s[2] = num % 100 / 10
s[3] = num % 10
}
func OnGame(randSlice []int) {
var num int
keySlice := make([]int, 4)
for {
for {
fmt.Printf("请输入一个四位数:")
fmt.Scan(&num)
if 999 < num && num < 10000 {
break
}
fmt.Printf("输入的不符合要求,请重新输入\n")
}
GetNum(keySlice, num)
n := 0
for i := 0; i < 4; i++ {
if randSlice[i] < keySlice[i] {
fmt.Printf("第%d位大了一点\n", i+1)
} else if randSlice[i] > keySlice[i] {
fmt.Printf("第%d位小了一点\n", i+1)
} else {
fmt.Printf("第%d猜对了!\n", i+1)
n++
}
}
if n == 4 {
fmt.Printf("全猜对了!\n")
break
}
}
}
func main() {
var randNum int
//产生四位的随机数
CreatNum(&randNum)
//fmt.Println("randNum=", randNum)
randSlice := make([]int, 4)
//保存四位中的每一位
GetNum(randSlice, randNum)
OnGame(randSlice)
}
标签:slice,--,fmt,切片,int,num,数组,Go
From: https://blog.csdn.net/m0_73537205/article/details/140083846