Краткие объявления переменных Golang показывают ошибку, не решенную - PullRequest
0 голосов
/ 10 октября 2018

Я новая рука с 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


Обновление-2

Это работает, я не замечаю @GreatDharmatma return (err error)

Это моя вина.

Это резюме:

  1. := используется, только если все левые переменные не объявлены до

  2. , если a variable было объявлено ранее (например, c.file).

    Нам нужно предварительно объявить err до os.OpenFile(path,os.O_CREATE | os.O_RDWR,0755)

    var err error

  3. Другим способом решения этой проблемы является использование 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 ...

, что недопустимо.

Спасибо. Вопрос более

1 Ответ

0 голосов
/ 10 октября 2018

Проблема здесь в том, что вы используете: =

Использование короткого объявления переменных требует, чтобы обе переменные не были объявлены первыми.В вашем случае объявлен c.file, а err - нет.Отсюда и ошибка.Вместо этого попробуйте следующий фрагмент:

func (c *FileController)OpenFile(path string)(err error){
    c.file, err = os.OpenFile(path,os.O_CREATE | os.O_RDWR,0755)

    //return some value these
}

Это должно прекрасно работать

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...