我有以下Go示例:
package main
import (
"fmt"
"log"
"os"
"strconv"
)
func main() {
numberOfUsers := 10
numberOfUsersStr, found := os.LookupEnv("NUMBER_OF_USERS")
if found {
numberOfUsers, err := strconv.Atoi(numberOfUsersStr)
if err != nil {
log.Fatalln(err)
}
}
fmt.Printf("Number of users: %d", numberOfUsers)
}
当构建这个狙击手时,我得到以下错误:
> go build -o app .
.app.go:14:3: numberOfUsers declared but not used
很明显,该变量是在最后一个print语句中使用的,但它似乎对编译器是隐藏的。我错过了什么?
使用:=
时,正在声明一个新变量。这意味着这里的numberOfUsers
:
numberOfUsers, err := strconv.Atoi(numberOfUsersStr)
实际上是在遮蔽您的另一个numberOfUsers
变量。
您可以通过预先声明err
,然后只使用=
而不是:=
来修复它,这样您只会为变量分配一个新值,而不会声明一个新变量。
var err error
numberOfUsers, err = strconv.Atoi(numberOfUsersStr)
此行中的numberOfUsers
变量未使用:numberOfUsers, err := strconv.Atoi(numberOfUsersStr)
。
在这里,您将在if
语句的作用域中重新声明一个新的变量numberOfUsers
。此变量未在该范围内使用,因此出现错误。
你可能想要这样的东西:
func main() {
numberOfUsers := 10
numberOfUsersStr, found := os.LookupEnv("NUMBER_OF_USERS")
if found {
var err error
numberOfUsers, err = strconv.Atoi(numberOfUsersStr)
if err != nil {
log.Fatalln(err)
}
}
fmt.Printf("Number of users: %d", numberOfUsers)
}
注意:=
(声明一个赋值新变量(和=
(仅赋值(之间的区别。