亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

聲明但未使用

聲明但未使用

Go
瀟瀟雨雨 2022-01-17 10:18:28
我找不到為什么下面的代碼會給出編譯錯誤“已聲明且未使用”。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 回答

?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

您看到的編譯錯誤正是正在發生的事情。那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    

}

請注意,我活著回來了。該功能是無用的,不是我建議的東西,但它應該有助于說明您的示例中缺少的內容。


查看完整回答
反對 回復 2022-01-17
?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

由于它是一個局部變量,它會在函數結束時退出作用域。alive在函數內部既不求值也不返回。因此編譯器抱怨。


查看完整回答
反對 回復 2022-01-17
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

Golang Devs 團隊負責人的那些奇怪的限制非常煩人。


為什么不允許人們使用選項來禁用他們的限制?


答案很簡單:他們為自己(為 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

[每個新版本] 應用一次補丁比每次處理每個丟失的變量要快得多。


查看完整回答
反對 回復 2022-01-17
  • 3 回答
  • 0 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號