二、数组和切片

(1) 切片的初始化与追加

1.2 写出程序运行的结果

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func main(){
  6. s := make([]int, 10)
  7. s = append(s, 1, 2, 3)
  8. fmt.Println(s)
  9. }

考点

切片追加, make初始化均为0

结果

  1. [0 0 0 0 0 0 0 0 0 0 1 2 3]

(2) slice拼接问题

下面是否可以编译通过?

test6.go

  1. package main
  2. import "fmt"
  3. func main() {
  4. s1 := []int{1, 2, 3}
  5. s2 := []int{4, 5}
  6. s1 = append(s1, s2)
  7. fmt.Println(s1)
  8. }

结果

编译失败

两个slice在append的时候,记住需要进行将第二个slice进行...打散再拼接。

  1. s1 = append(s1, s2...)

(3) slice中new的使用

下面代码是否可以编译通过?

test9.go

  1. package main
  2. import "fmt"
  3. func main() {
  4. list := new([]int)
  5. list = append(list, 1)
  6. fmt.Println(list)
  7. }

结果

编译失败,./test9.go:9:15: first argument to append must be slice; have *[]int

分析

切片指针的解引用。

可以使用list:=make([]int,0) list类型为切片

或使用list = append(\list, 1) list类型为指针

new和make的区别:

​ 二者都是内存的分配(堆上),但是make只用于slice、map以及channel的初始化(非零值);而new用于类型的内存分配,并且内存置为零。所以在我们编写程序的时候,就可以根据自己的需要很好的选择了。

​ make返回的还是这三个引用类型本身;而new返回的是指向类型的指针。