Go:slice

一、切片创建方式

func main() {
	// 创建切片方式1
	// 让切片引用一个数组
	array := [...]int{1, 2, 3, 4}
	slice1 := array[1:3]
	fmt.Println(slice1) // [2 3]

	// 创建切片方式2
	// 通过make方式创建切片
	var slice2 []int // 这是切片定义,需要让其引用一个数组,或make一下才能使用!!!
	slice2 = make([]int, 4)
	fmt.Println(slice2) // [0 0 0 0]

	var slice3 = make([]int, 4, 8) // 8为容量(cap),可选
	fmt.Println(slice3) // [0 0 0 0]

	slice4 := make([]string, 4)
	fmt.Println(slice4) // [   ]
	fmt.Println(cap(slice4)) // 4

	// 创建切片方式3
	// 定义一个切片,直接就指定具体数组,原理类似make方式
	var slice5 = []float64{1.11, 2.22, 3.33}
	slice6 := []string{"a", "b"}
	fmt.Printf("%.1f\n", slice5) // [1.1 2.2 3.3]
	fmt.Println(slice6) // [a b]
}

方式1与方式2的区别:

  • 方式1是直接引用数组,这个数组是事先存在的,程序员是可操作的;
  • 方式2是通过make来创建切片,make会创建一个数组,而切片就是引用这个数组,这个数组是由切片在底层进行维护,程序员不可操作。

二、切片的添加操作

func main() {
	slice := []string{"a", "b"}
	fmt.Println(slice) // [a b]
	slice = append(slice, "c", "d")
	fmt.Println(slice) // [a b c d]
	slice = append(slice, slice...)
	fmt.Println(slice) // [a b c d a b c d]
}

三、切片的拷贝操作

# 参数的数据类型都是切片
copy(param1, param2)
func main() {
	slice1 := []int{1, 2, 3}
	slice2 := make([]int, 5)
	slice3 := make([]int, 2)
	copy(slice2, slice1)
	fmt.Println(slice2) // [1 2 3 0 0]
	copy(slice3, slice1)
	fmt.Println(slice3) // [1 2]
}

四、string与slice关系

string底层是一个byte数组,因此string也可以进行切片操作(这里不演示)。

string是不可变的,因此不能通过 str[0] = 'xx' 方式来修改字符串;如果需要修改字符串,可以先将 string 转成 []byte 或者 []rune 类型,修改后再转回。

func main() {
	str := "Hello"
	sli := []byte(str)
	sli[0] = 'h'
	fmt.Println(sli) // [104 101 108 108 111]
	str = string(sli)
	fmt.Println(str) // hello

	// 推荐使用下面方式(支持中文)
	s := []rune(str)
	s[0] = '吖'
	str = string(s)
	fmt.Println(str) // 吖ello
}

 

posted @ 2019-05-26 23:17  就俗人一个  阅读(196)  评论(0编辑  收藏  举报