package main
import(
"fmt"
)
func main(){
//创建slice
// 1.通过数组
// 创建了一个长度为 4 的 int 数组,并返回一个切片给 slice1。
slice1 := []int{1,2,3,4} //[]中有...就是定义数组了
fmt.Println("slice1 = ", slice1)
array := [...]int{2,3,4,5} //定义数组array
slice2 := array[:] //切片本身不包含任何数据。它仅仅是底层数组的一个上层表示。
fmt.Println("slice2 = ",slice2) //对切片进行的任何修改都将反映在底层数组中。
slice3 := array[1:3]
fmt.Println("slice3 = ",slice3) //[1:3] 是下标1,2
// 2.用 make 创建切片
// 内置函数 func make([]T, len, cap) []T 可以用来创建切片,
// 该函数接受长度和容量作为参数,返回切片。容量是可选的,默认与长度相同。
// 使用 make 函数将会创建一个数组并返回它的切片。
// 用 make 创建的切片的元素值默认为 0 值。
i := make([]int, 5, 5)
fmt.Println(i)
i[0] = 1
fmt.Println(i)
//切片本身不包含任何数据。它仅仅是底层数组的一个上层表示。对切片进行的任何修改都将反映在底层数组中。
//修改切片直接修改了底层的数组
darr := [...]int{57, 89, 90, 82, 100, 78, 67, 69, 59}
dslice := darr[2:5]
fmt.Println("array before",darr)
for i := range dslice {
dslice[i]++
}
fmt.Println("array after",darr)
//切片的长度len()和容量cap()
//切片的长度是指切片中元素的个数。切片的容量是指从切片的起始元素开始到其底层数组中的最后一个元素的个数。
slice4 := []int{1,2,3,4} //[]中有...就是定义数组了
fmt.Printf("slice4 = %v.长度 = %d.容量 = %d", slice4 , len(slice4) , cap(slice4))
fmt.Println()
array1 := [...]int{1,2,3,4,5,6,7,8,9} //定义数组array
slice5 := array1[1:5] //len 为4,cap是从左坐标开始到底层数组的结尾
fmt.Printf("slice5 = %v.长度 = %d.容量 = %d", slice5 , len(slice5) , cap(slice5))
fmt.Println()
/*
slice长度可变的原理:当超出切片的容量时,append 将会在其内部创建新的数组,
该数组的大小是原切片容量的 2 倍。最后 append 返回这个数组的全切片,即从 0 到 length - 1 的切片
*/
/*
slice6 = append(slice6,7) 切片的增加,可以增加多个
*/
slice6 := []int{1,2,3,4,5,6}
fmt.Printf("slice6 = %v.长度 = %d.容量 = %d\n", slice6 , len(slice6) , cap(slice6))
// slice6 = append(slice6,7)
slice7 := append(slice6,7,8,9,10)
fmt.Printf("slice7 = %v.长度 = %d.容量 = %d\n", slice7 , len(slice7) , cap(slice7))
/*
切片的 0 值为 nil。一个 nil 切片的长度和容量都为 0。可以利用 append 函数给一个 nil 切片追加值。
*/
var slice_nil []int //就叫nil
fmt.Println(slice_nil==nil) //就叫nil
fmt.Printf("slice_nil = %v.长度 = %d.容量 = %d\n", slice_nil , len(slice_nil) , cap(slice_nil))
slice_nil = append(slice_nil,1,2,3,4)
fmt.Printf("slice_nil = %v.长度 = %d.容量 = %d\n", slice_nil , len(slice_nil) , cap(slice_nil))
/*
slice 切片作为函数参数
当将一个切片作为参数传递给一个函数时,虽然是值传递,但是指针始终指向同一个数组。
因此将切片作为参数传给函数时,函数对该切片的修改在函数外部也可以看到。
与数组相反,数组不改变。而切片是指向所以改变底层数组
*/
sli := []int{1,2,3}
fmt.Printf("调用函数之前的sli%v\n", sli)
twopuls(sli)
fmt.Printf("调用函数之后的sli%v\n", sli)
for key, value := range []int{1, 2, 3, 4} {
fmt.Printf("key:%d value:%d\n", key, value)
}
/*
多维切片
*/
pli := [][]int{
{1,2},
{3,4},
{4,5},
}
fmt.Printf("pli = %v.长度 = %d.容量 = %d\n", pli , len(pli) , cap(pli))
for k1:= range pli{
for k2:=range pli[k1]{
fmt.Printf("%d ",pli[k1][k2])
}
fmt.Println()
}
for _, v1 := range pli {
for _, v2 := range v1 {
fmt.Printf("%d ", v2)
}
fmt.Printf("\n")
}
fmt.Printf("%d",pli[1][0]) //取值与二维数组一样
}
func twopuls(a []int){
// for k := range a { //一个默认key
// a[k] = a[k] * 2
// }
for k,v := range a{
v = 2*v //注意这句话基本没有用,改变临时变量而已,改变slice的东西用下标来找指针
a[k] = a[k] * 2
}
}
golang 切片
最新推荐文章于 2023-10-26 11:44:33 发布