du0531 2018-10-10 01:13
浏览 276
已采纳

Golang短变量声明显示err无法解析

I am a new hand come from Java to Go

Look at my codes

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
}

I want to open a file but this not works

Goland tell me Unresolved reference 'err'

If I init err first, I write follow codes

var err error
c.file, err = os.OpenFile(path,os.O_CREATE | os.O_RDWR,0755)

Goland also tell me Unused variable 'err'

But if I use

f, err := os.OpenFile(path,os.O_CREATE | os.O_RDWR,0755)
c.file = f
_ = err

I works

I think := will works at least have a un-declaration variable in left

c.file already been inited, err a new variable.

Should I must use second way?

I feel that the first way is not elegant.


Update-1

When I use @GreatDharmatma method.

Golang tell me Unresolved variable err

enter image description here


Update-2

It's works, I not notice @GreatDharmatma return (err error)

It's my fault.

This's a Summary:

  1. := used only if all of left variable not declare before

  2. if a variable have been declared before(like c.file).

    We need pre-declare err before os.OpenFile(path,os.O_CREATE | os.O_RDWR,0755)

    var err error

  3. Another way to solve this problem is use named return value as @GreatDharmatma said.

From Golang docs

Docs-Named-variable

Go's return values may be named. If so, they are treated as variables defined at the top of the function.

Thank all of you! Have a nice day!


Update-3 After two days

From @LukeJoshuaPark comment.

Using a short variable declaration requires both variables to not be declared first" - Not true. To use a short variable declaration, at least one must not be declared

What LukeJoshuaPark is right, I ask a same in golang-nuts

My reply

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 `:=`?

heat-heart firend said

That is correct. A member field cannot be on the left side of :=

This is the from the spec:

It is shorthand for a regular variable declaration with initializer expressions but no types:

"var" IdentifierList = ExpressionList .

So,

x, y:=values

is identical to

var x, y = values

Applying this rule to your example, it becomes:

var c.file, err=os.OpenFile...

which is not valid.

Thanks.Question Over

  • 写回答

1条回答 默认 最新

  • dryl34156 2018-10-10 01:21
    关注

    The problem here is because you are using :=

    Using a short variable declaration requires both variables to not be declared first. In your case c.file is declared and err is not. Hence the error. Try the following snippet instead.

    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
    }
    

    This should work just fine

    enter image description here

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 matlab提取运动物体的坐标
  • ¥15 人大金仓下载,有人知道怎么解决吗
  • ¥15 一个小问题,本人刚入门,哪位可以help
  • ¥15 python安卓开发
  • ¥15 使用R语言GD包一直不出结果
  • ¥15 计算机微处理器与接口技术相关问题,求解答图片的这个问题,有多少个端口,端口地址和解答问题的方法和思路,不要AI作答
  • ¥15 如何根据一个截图编写对应的HTML代码
  • ¥15 stm32标准库的PID角度环
  • ¥15 ADS已经下载好了,但是DAS下载不了,一直显示这两种情况,有什么办法吗,非常急!
  • ¥100 Excel 点击发送自动跳转outlook邮件