Go语言 错误:“已声明但未使用”,即使我为它赋值

x0fgdtte  于 2022-12-07  发布在  Go
关注(0)|答案(3)|浏览(234)

我找不到为什么下面的代码会出现编译错误“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
    }
}
4xy9mtcn

4xy9mtcn1#

您看到的编译错误 * 正是 * 所发生的。var alive bool未被使用。您声明了它并为其赋值,但从未对它执行任何操作。
下面是对您的代码的一个playground友好修改,它将运行:

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    
}

注意,我活着回来了。这个函数是无用的,我不会建议它本身,但它应该有助于说明你的例子中缺少了什么。

utugiqy6

utugiqy62#

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

bkhjykvo

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

与每次处理每个遗漏的变量相比,[每个新版本]应用一次补丁要快得多。

相关问题