2017-02-06 20 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) 

Я получаю ошибку

.\run.go:262: undefined: dat 

Я уверен, что это только основные GOLANG вещи я все еще учусь.

Спасибо за вашу поддержку

+0

'если-else' блоки имеют свой собственный объем. 'dat' не видно за пределами них. Вы можете объявить 'var dat [] byte' перед' if (bundled == "true") ', чтобы исправить это. Читайте: [Области декларации в Go] (https://dave.cheney.net/2016/12/15/declaration-scopes-in-go) –

+0

Как можно объявить, что я мог бы выполнить этот запрос. Есть ли способ создать владельца места. Я не понимал, что если они были в своем собственном пространстве. Интересно, что – user3888307

+0

объявляет переменные в требуемой области. Для справки: https://golang.org/ref/spec#Declarations_and_scope – JimB

ответ

1

if-else блоки имеют свой собственный объем. В вашем случае dat не видно за пределами них.

Вы можете объявить var dat []byte до if (bundled == "true"), чтобы исправить это.

Docs: https://golang.org/ref/spec#Declarations_and_scope

Вы также можете прочитать: Declaration scopes in Go

+0

Хорошо, я получил его, чтобы скомпилировать, посмотреть, работает ли он. Я должен был заранее объявить это: = [] byte {} – user3888307

+0

Рекомендуется использовать 'var dat [] byte' over' dat: = [] byte {} '. Основная причина заключается в том, что первый определяет слой _nil_, в то время как последний определяет фрагмент _empty_. Это не только облегчает проверку среза, но позволяет избежать выделения среза до тех пор, пока вы не добавите к нему что-либо (и в этом случае вы просто выбросите исходное распределение). Кроме того, вы хотите заранее объявить переменную 'err' и полностью исключить назначение коротких форм в выражении if, иначе вы просто замаскируете переменную' dat'. – Kaedys