我找不到为什么下面的代码会出现编译错误“alive declared and not used”。
func ping(ip string) { var alive bool _, err := exec.Command("ping", "-n 1", "-w 1000", ip).Output() if err != nil { alive = false } else { alive = true } }
4xy9mtcn1#
您看到的编译错误 * 正是 * 所发生的。var alive bool未被使用。您声明了它并为其赋值,但从未对它执行任何操作。下面是对您的代码的一个playground友好修改,它将运行:
var alive bool
package main import ( "fmt" "strconv" ) func main() { fmt.Println(isInt("Hello, playground")) // prints false fmt.Println(isInt("1234567890")) // prints true } func isInt(s string) bool { var alive bool _, err := strconv.Atoi(s) // simply to demonstrate an error case if err != nil { alive = false } else { alive = true } return alive }
注意,我活着回来了。这个函数是无用的,我不会建议它本身,但它应该有助于说明你的例子中缺少了什么。
utugiqy62#
因为它是一个局部变量,所以它会在函数结束时退出作用域。alive既不会在函数内部求值也不会返回。因此编译器会抱怨。
alive
bkhjykvo3#
这些奇怪的限制在戈朗开发团队负责人是非常恼人的。为什么不允许人们用选择来禁用他们的限制呢?答案很简单:他们为自己(为古格尔)而不是为社区写lang。幸运的是,Go语言是开源的,甚至是用Go语言编写的。因此,这里有一个简单的修补程序,可以消除“已声明但未使用”或“已声明但未使用”错误引发的问题:
diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go index 770210f..78c0cbc 100644 --- a/src/cmd/compile/internal/gc/walk.go +++ b/src/cmd/compile/internal/gc/walk.go @@ -49,10 +49,7 @@ func walk(fn *Node) { if defn.Left.Name.Used() { continue } - yyerrorl(defn.Left.Pos, "%v declared and not used", ln.Sym) defn.Left.Name.SetUsed(true) // suppress repeats - } else { - yyerrorl(ln.Pos, "%v declared and not used", ln.Sym) } } diff --git a/src/go/types/stmt.go b/src/go/types/stmt.go index abd9d05..8b15786 100644 --- a/src/go/types/stmt.go +++ b/src/go/types/stmt.go @@ -55,6 +55,7 @@ func (check *Checker) funcBody(decl *declInfo, name string, sig *Signature, body } func (check *Checker) usage(scope *Scope) { + return var unused []*Var for _, elem := range scope.elems { if v, _ := elem.(*Var); v != nil && !v.used {
(go1.12的实际值)将一个新的Golang解压缩到/usr/local/go并应用补丁。然后编译:
export GOROOT_BOOTSTRAP=/usr/local/go2 cp -a /usr/local/go /usr/local/go2 cd /usr/local/go/src sed -e 's#^bash run.bash.*##' -i all.bash ./all.bash rm -rf /usr/local/go2 unset GOROOT_BOOTSTRAP
与每次处理每个遗漏的变量相比,[每个新版本]应用一次补丁要快得多。
3条答案
按热度按时间4xy9mtcn1#
您看到的编译错误 * 正是 * 所发生的。
var alive bool
未被使用。您声明了它并为其赋值,但从未对它执行任何操作。下面是对您的代码的一个playground友好修改,它将运行:
注意,我活着回来了。这个函数是无用的,我不会建议它本身,但它应该有助于说明你的例子中缺少了什么。
utugiqy62#
因为它是一个局部变量,所以它会在函数结束时退出作用域。
alive
既不会在函数内部求值也不会返回。因此编译器会抱怨。bkhjykvo3#
这些奇怪的限制在戈朗开发团队负责人是非常恼人的。
为什么不允许人们用选择来禁用他们的限制呢?
答案很简单:他们为自己(为古格尔)而不是为社区写lang。
幸运的是,Go语言是开源的,甚至是用Go语言编写的。
因此,这里有一个简单的修补程序,可以消除“已声明但未使用”或“已声明但未使用”错误引发的问题:
(go1.12的实际值)
将一个新的Golang解压缩到/usr/local/go并应用补丁。
然后编译:
与每次处理每个遗漏的变量相比,[每个新版本]应用一次补丁要快得多。