Я новая рука с Java
до Go
Посмотрите на мои коды
package utils
import "os"
type FileController struct{
file *os.File
}
func (c *FileController)OpenFile(path string)error{
c.file, err := os.OpenFile(path,os.O_CREATE | os.O_RDWR,0755)
//return some value these
}
Я хочу открыть файл, но это не работает
Голанд скажи мне Unresolved reference 'err'
Если я сначала введу ошибку, я напишу следующие коды
var err error
c.file, err = os.OpenFile(path,os.O_CREATE | os.O_RDWR,0755)
Goland
и скажи мне Unused variable 'err'
Но еслиЯ использую
f, err := os.OpenFile(path,os.O_CREATE | os.O_RDWR,0755)
c.file = f
_ = err
Я работаю
Я думаю, что :=
будет работать, по крайней мере, будет иметь переменную необъявления слева
c.file уже запущен, ошибкановая переменная.
Должен ли я использовать второй способ?
Мне кажется, что первый способ не элегантен.
Update-1
Когда я использую метод @GreatDharmatma.
Голанг, скажи мне Unresolved variable err
![enter image description here](https://i.stack.imgur.com/fPnIH.png)
Обновление-2
Это работает, я не замечаю @GreatDharmatma return (err error)
Это моя вина.
Это резюме:
:=
используется, только если все левые переменные не объявлены до
, если a variable
было объявлено ранее (например, c.file).
Нам нужно предварительно объявить err
до os.OpenFile(path,os.O_CREATE | os.O_RDWR,0755)
var err error
Другим способом решения этой проблемы является использование named return value
, как сказано @GreatDharmatma
.
С Golang docs
Документы-Named-variable
Возвращаемые значения Go могут быть названы.Если это так, они рассматриваются как переменные, определенные в верхней части функции.
Спасибо всем вам!Хорошего дня!
Обновление-3 Через два дня
Из комментария @LukeJoshuaPark.
Использование короткой переменнойобъявление требует, чтобы обе переменные не были объявлены первыми "- Не верно. Чтобы использовать краткое объявление переменной, по крайней мере, одна не должна быть объявлена
Что правильно LukeJoshuaPark
, я спрашиваю то же самое в golang-nuts
Мой ответ
For all typed object such as `type *** struct`, `type *** func()`, `type **** int`, their field cannot be redeclare? and cannot be used at left side of `:=`?
Сказал жар-сердце
Это правильно. AПоле члена не может быть слева от: =
Это из спецификации:
Это сокращение для объявления обычной переменной с выражениями инициализатора, но без типов:
"var" IdentifierList = ExpressionList.
Итак,
x, y: = значения
идентичны
var x, y = значения
Применяя это правило к вашему примеру, оно становится:
var c.file, err = os.OpenFile ...
, что недопустимо.
Спасибо. Вопрос более