Golang中如何在条件语句内赋值变量

Golang中如何在条件语句内赋值变量 我想这样写:

length := 10
if len(os.Args) == 2 {
       length, err = strconv.Atoi(os.Args[1])
		if err != nil {
			log.Fatal(err)
		}
	}

但被迫写成这样:

length := 10
if len(os.Args) == 2 {
        l, err := strconv.Atoi(os.Args[1])
	if err != nil {
			log.Fatal(err)
	}
	length = l
}

我是不是漏掉了什么?


更多关于Golang中如何在条件语句内赋值变量的实战教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

第一个有什么问题?两个代码段的可观察效果应该是一样的

更多关于Golang中如何在条件语句内赋值变量的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


啊,哎呀,你们俩说得都对。看来你得用那个解决方案,并事先声明错误。

请查看这里:https://play.golang.org/p/mo-cEC4uIhA 由于我需要首次为"err"赋值,因此无法编译通过

,这会在内部作用域中声明 length 从而造成变量遮蔽,如以下示例所示:https://play.golang.org/p/2vdMbSjgrLW

嗯,我也可以这样做:

	length := 10
	var err error
	if len(os.Args) == 2 {
		length, err = strconv.Atoi(os.Args[1])
		if err != nil {
			log.Fatal(err)
		}
	}

kerokero:

这样无法编译,因为我需要首次对"err"进行赋值

我猜你没有复制那部分代码。遗憾的是,每次我写Go代码需要重复使用错误变量时,几乎在每个函数里都会有多余的err变量。

func main() {
    fmt.Println("hello world")
}

将这段代码:

length, err = strconv.Atoi(os.Args[1])

改为:

length, err := strconv.Atoi(os.Args[1])

由于您已经创建了 length 变量,但在该行中同时创建了 err 变量。因此,需要添加冒号来声明变量。

正如@iegomez所说,这会引入一个微妙的错误(好吧,在我的代码片段中它不会编译,但这只是运气好)。 我认为在条件语句中分配变量是最简洁的解决方案,虽然我并不是很喜欢这种方式。

在Go语言中,你遇到的情况是由于作用域规则导致的。在条件语句块内使用:=会创建新的局部变量,而不是对外部变量进行赋值。

你的第一种写法会导致编译错误,因为在if语句块内,length, err := ...会创建两个新的局部变量lengtherr,而不是使用外部的length变量。

正确的做法有以下几种:

方法1:预先声明变量,在条件语句内使用赋值操作符=

length := 10
var err error

if len(os.Args) == 2 {
    length, err = strconv.Atoi(os.Args[1])
    if err != nil {
        log.Fatal(err)
    }
}

方法2:使用临时变量再赋值(就是你现在的写法)

length := 10
if len(os.Args) == 2 {
    l, err := strconv.Atoi(os.Args[1])
    if err != nil {
        log.Fatal(err)
    }
    length = l
}

方法3:使用函数返回值

length := 10
if len(os.Args) == 2 {
    var err error
    length, err = strconv.Atoi(os.Args[1])
    if err != nil {
        log.Fatal(err)
    }
}

方法4:使用匿名函数创建独立作用域

length := 10
if len(os.Args) == 2 {
    func() {
        var err error
        length, err = strconv.Atoi(os.Args[1])
        if err != nil {
            log.Fatal(err)
        }
    }()
}

第一种方法是最常用和推荐的,因为它保持了代码的简洁性,同时避免了不必要的临时变量。

回到顶部