```go
package main
import (
"fmt"
"net"
)
func test() (int, int) {
return 2, 3
}
func main() {
a, b := test()
a, b := test()//编译报错 no new variables on left side of :=
add1 := "0.0.0.0:1234"
add2 := "0.0.0.0:4321"
server1, err := net.Listen("tcp", add1)
defer server1.Close()
server2, err := net.Listen("tcp", add2)//err 编译没报错
if err != nil {
fmt.Println(err.Error())
return
}
defer server2.Close()
}
```
**不知道什么原因**<br>
请教
而且提示意图很明显
“no new variables on left side of :=” “:=的左边没有新的变量需要赋值”
go的错误提示很全面 很精确 很优雅
读懂报错很重要 ~
#2
更多评论
```golang
package main
import "fmt"
func main() {
// 首次使用使用:=声明并赋值
a, b := 1, 1
// 再次使用时用=来赋值,之前已经声明过了
a, b = 2, 2
// 参数中仍然有值未声明,可以继续使用:=来赋值声明
// 其实只是声明c,然后给a,c赋值,a并未重复声明
// 你可以通过下面的语句来进行实验
// a, c := "1", 2 //报错误 cannot use "1" (type string) as type int in assignment
a, c := 1, 2
// 这里还有个坑
// 函数体内,使用:=来赋值时,虽然其中有一个参数已经赋值,这两个变量会变成局部变量
// 不会影响外面的参数值,
if true {
a, d := "4", "5"
fmt.Println(a, d) // 4 5
}
fmt.Println(a) // 1
// 如果希望使用外部变量,需要先声明d的类型,然后再赋值
if true {
var d string
a, d = 4, "5"
fmt.Println(d) // 5
}
fmt.Println(a, b, c) // 4 2 2
}
```
#3