GO学习-切片
GO切片
创建切片,创建切片有两种,make创建感觉好用一些,要指定它的容量,需向 make 传入第三个参数,类型,长度,和容量
package main
import "fmt"
func main() {
q := []int{2, 3, 5, 7, 11, 13}
fmt.Println(q)
r := []bool{true, false, true, true, false, true}
fmt.Println(r)
s := []struct {
i int
b bool
}{
{2, true},
{3, false},
{5, true},
{7, true},
{11, false},
{13, true},
}
fmt.Println(s)
}
// 也可以用make创建切片
func main() {
a := make([]int, 5)
printSlice("a", a)
b := make([]int, 0, 5)
printSlice("b", b)
c := b[:2]
printSlice("c", c)
d := c[2:5]
printSlice("d", d)
}
func printSlice(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n",
s, len(x), cap(x), x)
}
//a len=5 cap=5 [0 0 0 0 0]
//b len=0 cap=5 []
//c len=2 cap=5 [0 0]
//d len=3 cap=3 [0 0 0]
切片并不存储任何数据,它只是描述了底层数组中的一段。
更改切片的元素会修改其底层数组中对应的元素。
与它共享底层数组的切片都会观测到这些修改。
切片的用法比较类似JavaScript,和python简单写一些(复制一下)
func main() {
names := [4]string{
"John",
"Paul",
"George",
"Ringo",
}
fmt.Println(names)
a := names[0:2]
b := names[1:3]
fmt.Println(a, b)
b[0] = "XXX"
fmt.Println(a, b)
fmt.Println(names)
}
其中有个切片练习,
实现 Pic。它应当返回一个长度为 dy 的切片,其中每个元素是一个长度为 dx,元素类型为 uint8 的切片。当你运行此程序时,它会将每个整数解释为灰度值(好吧,其实是蓝度值)并显示它所对应的图像。 图像的选择由你来定。几个有趣的函数包括 (x+y)/2, x*y, x^y, x*log(y) 和 x%(y+1)。 (提示:需要使用循环来分配 [][]uint8 中的每个 []uint8;请使用 uint8(intValue) 在类型之间转换;你可能会用到 math 包中的函数。)
package main
import "golang.org/x/tour/pic"
func Pic(dx, dy int) [][]uint8 {
// 试了下可以这样创建
s := make([][]uint8, dy)
// for i,v := range [slice] 这个传的v值应该是值传递,直接修改后不体现在原来的切片 和python一样
for x, _ := range s{
s1 := make([]uint8, dx)
for y:=0; y<dx; y++{
// 这里如果用v[y]赋值的话,最后的s结果为 [[],[],[],[],[],[]....]会报错超数组边界
s1[y] = uint8(x^y)
}
s[x] = s1
}
return s
}
func main() {
pic.Show(Pic)
}
执行结果下图:

类似python中,循环list或者dict也是副本,可能是平时接触java比较多,为for一个list或者map里面的对象得到的结果是引用,可以直接赋值
dic = {'1': '草莓', '2': '苹果'}
print(dic)
for k, v in dic.items():
v = '橘子'
print(dic)
lis = ['草莓', '苹果']
print(lis)
for i in lis:
i = '橘子'
print(lis)
lis = [['草莓'], ['苹果']]
print(lis)
for i in lis:
i = ['橘子']
print(lis)
# 执行结果
# {'1': '草莓', '2': '苹果'}
# {'1': '草莓', '2': '苹果'}
# ['草莓', '苹果']
# ['草莓', '苹果']
# [['草莓'], ['苹果']]
# [['草莓'], ['苹果']]

浙公网安备 33010602011771号