:=

1. 多变量赋值可能会重新声明

  • 左侧存在新变量,则旧变量会被重新声明
  • 左侧无新变量,则会报错 no new variable on left side of :=

所以我们看下面的例子:

1
2
i, j := 0, 1
k, j := 5, 4 //这里的j其实是被重新声明的了,值为4

2. 不能用于函数外部

可以将:=分解为声明和赋值,而赋值不能出现在函数外部
会报错syntax error: non-declaration statement outside function body

还要充分注意作用域的为题

可变参数 ...

如最常用的fmt.Println(arg ...interface{})
attention:

  • 可变参数及 …必须写在参数列表最右边
  • 内部当作 slice 解析,可以用range 遍历

按上面所说可以当作slice解析,所以可变参数能直接传slice类型,但注意要以 name… 的格式。

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
func Greeting(greets string, who ...string){
if who == nil{
fmt.Printf("No body to say hi.")
return
}

for _, people := range who{
fmt.Printf("%s %s\n", greets, people)
}
}

fun GreetTest(){
guests := []slice{"Joe", "Anna", "Eileen"}
//调用Greeting, 直接传递切片
Greeting("hello", guests...)
}

坑!!!

《Go专家编程》就告一段落了,计划看下《图解http》和《redis实战》