声明但未使用

时间:2016-05-31 23:14:16

标签: go

我无法找到为什么下面的代码会给出编译错误“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
    }
}

3 个答案:

答案 0 :(得分:1)

由于它是局部变量,因此它将在函数末尾退出范围。 alive既未评估也未在函数内返回。因此编译器抱怨。

答案 1 :(得分:1)

您看到的编译错误正是正在发生的事情。 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    
}

请注意我活着回来了。该函数是无用的,不是我自己建议的东西,但它应该有助于说明你的例子中缺少的东西。

答案 2 :(得分:0)

Golang开发团队负责人这些奇怪的局限性令人讨厌。

为什么不让人们禁用带有选项的限制?

答案很简单:他们为自己(为guugle)而不是为社区写语言。

幸运的是,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

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