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
第一个有什么问题?两个代码段的可观察效果应该是一样的
更多关于Golang中如何在条件语句内赋值变量的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
啊,哎呀,你们俩说得都对。看来你得用那个解决方案,并事先声明错误。
不,这会在内部作用域中声明 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 := ...会创建两个新的局部变量length和err,而不是使用外部的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)
}
}()
}
第一种方法是最常用和推荐的,因为它保持了代码的简洁性,同时避免了不必要的临时变量。


