2013-09-09 4 views
11

следующие работы в качестве функции, чтобы открыть файл: оператор = и если оператор в Golang

func openFile(filename string) { 
    var file *os.File 
    var err error 
    if file, err = os.Open(filename); err != nil { 
    log.Printf("Failed to open the file: %s.", filename) 
    return 
    } 
    defer file.Close() 
    // blahblahblah 
} 

однако, это не работает, когда я пытаюсь использовать: = объявить переменный файл

func updateFrequencies(filename string, frequencyForWord map[string]int) { 
    if file, err := os.Open(filename); err != nil { 
    .... 
    } 
} 

ошибка: ./word_frequencies_2.go:30 не определено: файл

Но если это изменилось немного, это работает

file, err := os.Open(filename) 
if err != nil { 
    log.Printf("Failed to open the file: %s.", filename) 
    return 
} 

Почему я не могу использовать: = как часть инструкции if?

ответ

26

Why can't I use := as part of the if statement?

Можно, но тогда переменные определены в пределах объема if блока. Таким образом, file не определен за пределами вашего блока if.

То же правило применяется к определениям в for, switch и аналогичным блокам.

6

Mostafa уже указал, что переменная file не определена из блока if, и вы уже видели, как это исправить.

Но у вашей функции есть еще две важные проблемы.

Первый заключается в том, что он ничего не возвращает.

Вы можете исправить это, изменив его

func openFile(filename string) *os.File, error { 
    ... implementation 
    return file, nil 
} 

Но пусть будет еще один: когда ваша функция заканчивается, она закрывает файл из-за defer file.Close(), так что пользователь этой функции получает закрытый файл. Правда в том, что ваша функция не имеет особого смысла. Вы можете исправить это, разрешив ему пройти обратный вызов, который будет использовать этот файл, или разрешив пользователю закрыть файл, но нужно сделать прямо, чтобы открыть файл там, где он вам нужен.