Golang

  1. 下面两段代码输出什么
 1// 1.
 2 func main() {
 3     s := make([]int, 5)
 4     s = append(s, 1, 2, 3)
 5     fmt.Println(s)
 6 }
 7
 8// 2.
 9 func main() {
10    s := make([]int,0)
11    s = append(s,1,2,3,4)
12    fmt.Println(s)
13}

输出结果如下

1[0 0 0 0 0 1 2 3]
2[1 2 3 4]

使用make 新建 slice 会根据初始化的容量补0

  1. 这段代码的问题
1 func funcMui(x,y int)(sum int,error){
2        return x+y,nil
3 }

有多个返回值的时候,返回值的名字要么全部省略,要么全部写上

  1. new() 与make() 的区别

new(T)和make(T, args)是go语言的内建函数,用来分配内存,但是适用的类型不同。

new(T) 会为T类型分配已经置零的内存空间,并返回地址(指针),即类型为*T的值。换句话说就是,返回一个指针,该指针指向那个新分配的,类型为T的零值。适用于值类型,如数组、结构体等。

make(T,args) 返回初始化之后的 T 类型的值,这个值并不是 T 类型的零值,也不是指针 *T,是经过初始化之后的 T 的引用。make() 只适用于 slice、map 和 channel.

1func main() {
2	fmt.Println(">>> make: ")
3	fmt.Println(make([]int, 4))
4	fmt.Println(make(map[string]int))
5	fmt.Println(make(chan int, 5))
6
7	fmt.Println("\n >>> new:")
8	fmt.Println(new(int))
9}
1>>> make: 
2[0 0 0 0]
3map[]
40xc0000ba000
5
6 >>> new:
70xc0000b4038
  1. 下面这段代码能否通过编译,不能的话原因是什么;如果能,输出什么。
1func main() {
2    list := new([]int)
3    list = append(list, 1)
4    fmt.Println(list)
5}

不能通过编译,new([]int) 之后的 list 是一个 *[]int 类型的指针,不能对指针执行 append 操作。可以使用 make() 初始化之后再用。同样的,map 和 channel 建议使用 make() 或字面量的方式初始化,不要用 new() 。

  1. 下面这段代码能否通过编译,如果可以,输出什么?
1func main() {
2    s1 := []int{1, 2, 3}
3    s2 := []int{4, 5}
4    s1 = append(s1, s2)
5    fmt.Println(s1)
6}

不能通过编译。append() 的第二个参数不能直接使用 slice,需使用 操作符,将一个切片追加到另一个切片上:append(s1,s2…)。或者直接跟上元素,形如:append(s1,1,2,3)

  1. 下面这段代码能否通过编译,如果可以,输出什么?
1var(
2    size := 1024
3    max_size = size*2
4)
5
6func main() {
7    fmt.Println(size,max_size)
8}

不能通过编译。这道题的主要知识点是变量声明的简短模式,形如:x := 100。但这种声明方式有限制:

11.必须使用显示初始化;
22.不能提供数据类型,编译器会自动推导;
33.只能在函数内部使用简短模式;