2017-02-06 54 views
-1

我知道這是一個基本問題,但我很好奇爲什麼下面的代碼不起作用。沒有用例說明這個變量不會被聲明。if/else條件定義變量。 undefined:dat(變量)

if (bundled == "true") { 
      dat, err := Asset("index.html") 
     } else { 
      dat, err := ioutil.ReadFile("./index.html") 

     } 
     if (err != nil) { 
      os.Exit(0) 
     } 

     t, _ = t.Parse(string(dat)) 
     p := Person{Scope: ""} 
     t.Execute(w, p) 

我得到的錯誤

.\run.go:262: undefined: dat 

我敢肯定,這只是基本的東西GOLANG我還在學習。

感謝您的支持

+0

'如果-else'塊都有自己的範圍。 'dat'在他們之外是不可見的。你可以在if(bundled ==「true」)之前聲明'var dat [] byte'來解決它。閱讀:[在Go中的聲明範圍](https://dave.cheney.net/2016/12/15/declaration-scopes-in-go) –

+0

如何以可以完成此請求的方式聲明dat。有沒有辦法創建一個佔位符。我沒有意識到,如果他們在自己的空間。有趣的 – user3888307

+0

聲明你想要的範圍內的變量。作爲參考:https://golang.org/ref/spec#Declarations_and_scope – JimB

回答

1

if-else塊都有自己的範圍。你的情況dat是不可見的。

您可以在if (bundled == "true")之前聲明var dat []byte來解決它。

文檔:https://golang.org/ref/spec#Declarations_and_scope

您可能還需要閱讀:Declaration scopes in Go

+0

好吧,我得到它編譯,看看它是否工作。我不得不事先聲明這個dat:= [] byte {} – user3888307

+0

建議在'dat:= [] byte {}'上方使用'var dat [] byte''。主要原因是前者定義了_nil_片段,而後者定義了_empty_片段。這樣做不僅可以更容易地檢查切片,而且可以避免分配切片,直到您爲切片添加內容爲止(並且在這種情況下,您只需拋棄原始分配)。另外,你需要事先聲明'err'變量,並且完全消除if語句中的短格式賦值,否則你最終會掩蓋'dat'變量。 – Kaedys