关于:=请教下

zhjzjnb · 2018-02-07 20:21:11 · 1028 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-02-07 20:21:11 的主题,其中的信息可能已经有所发展或是发生改变。

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()
}

不知道什么原因
请教


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1028 次点击  
加入收藏 微博
3 回复  |  直到 2018-02-08 09:24:34
justay
justay · #1 · 7年之前

同学,你是来搞笑的吗。:=声明并赋值,你上面已经声明了,不需要再声明类型了,所以用=就好。

zxmin
zxmin · #2 · 7年之前

而且提示意图很明显 “no new variables on left side of :=” “:=的左边没有新的变量需要赋值” go的错误提示很全面 很精确 很优雅 读懂报错很重要 ~

justay
justay · #3 · 7年之前
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
}
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传