猿问

声明但未使用

我找不到为什么下面的代码会给出编译错误“已声明且未使用”。


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

    }

}


潇潇雨雨
浏览 180回答 3
3回答

繁花不似锦

您看到的编译错误正是正在发生的事情。那var alive bool是未使用的。您声明它并为其分配一个值,但您从未对它做任何事情。这是一个对游乐场友好的代码修改,它将运行:package mainimport (    "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    }请注意,我活着回来了。该功能是无用的,不是我建议的东西,但它应该有助于说明您的示例中缺少的内容。

慕莱坞森

由于它是一个局部变量,它会在函数结束时退出作用域。alive在函数内部既不求值也不返回。因此编译器抱怨。

慕标琳琳

Golang Devs 团队负责人的那些奇怪的限制非常烦人。为什么不允许人们使用选项来禁用他们的限制?答案很简单:他们为自己(为 guugle)而不是为社区编写语言。幸运的是,Go 是开源的,甚至是用 Go 编写的。因此,这是一个简单的补丁,删除了引发的“已声明但未使用”或“已声明但未使用”错误:diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.goindex 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.goindex 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/go2cp -a /usr/local/go /usr/local/go2cd /usr/local/go/srcsed -e 's#^bash run.bash.*##' -i all.bash./all.bashrm -rf /usr/local/go2unset GOROOT_BOOTSTRAP[每个新版本] 应用一次补丁比每次处理每个丢失的变量要快得多。
随时随地看视频慕课网APP

相关分类

Go
我要回答