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)
}

执行结果下图:

GO学习-切片_python

类似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': '苹果'}
# ['草莓', '苹果']
# ['草莓', '苹果']
# [['草莓'], ['苹果']]
# [['草莓'], ['苹果']]