2017-02-06 4 views
-1

これは基本的な質問ですが、私は以下のコードがうまくいかない理由が不思議です。この変数が宣言されないユースケースはありません。if/else条件で変数が定義されています。 undefined:dat(variable)

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) 

私はそれが私はまだ学んでいるだけで、基本的なGOLANGのものだと確信していますエラー

.\run.go:262: undefined: dat 

を取得します。ご支援

+0

'IF-else'ブロックは、独自のスコープを持っています。 'dat'はそれらの外側には見えません。 if(bundled == "true") 'の前に' var dat [] byte'を宣言して修正することができます。 Read:[Goの宣言スコープ](https://dave.cheney.net/2016/12/15/declaration-scopes-in-go) –

+0

このリクエストを完了できるように、どうやって宣言できますか?プレースホルダーを作成する方法はありますか?私はif/elseが自分の空間にあることに気付かなかった。興味深い – 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

さて、私はそれをコンパイルして、動作するかどうかを確認しました。私はこれを事前に宣言しなければなりません:= [] byte {} – user3888307

+0

'dat:= [] byte {}'に 'var dat [] byte 'を使うことをお勧めします。主な理由は、前者は_nil_スライスを定義し、後者は_empty_スライスを定義するということです。これにより、スライスのチェックが容易になるだけでなく、何かを追加するまでスライスの割り当てが行われなくなります(この場合は、元の割り当てを放棄するだけです)。また、 'err'変数を事前に宣言して、if文で短い形式の代入を完全に削除したい場合、代わりに' dat'変数をマスキングするだけです。 – Kaedys

関連する問題