Golang简短的变量声明显示未解决的错误

时间:2018-10-10 01:13:59

标签: go

我是一支从JavaGo的新手

看看我的密码

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已被初始化,错误了一个新变量。

我必须使用第二种方式吗?

我觉得第一种方法并不优雅。


更新1

当我使用@GreatDharmatma方法时。

Golang告诉我Unresolved variable err

enter image description here


Update-2

这是可行的,我没有注意到@GreatDharmatma返回(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

Docs-Named-variable

  

可以指定Go的返回值。如果是这样,则将它们视为在函数顶部定义的变量。

谢谢大家! 祝你有美好的一天!


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

热心对象

  

是正确的。成员字段不能位于:=

的左侧      

这是规范中的

     

这是带有初始化表达式但没有类型的常规变量声明的简写:

     

“ var” IdentifierList = ExpressionList。

     

所以

     

x,y:= values

     

相同      

var x,y = values

     

将此规则应用于您的示例,它将变为:

     

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

     

这是无效的。

谢谢。问题

1 个答案:

答案 0 :(得分:1)

这里的问题是因为您正在使用:=

使用简短的变量声明要求不先声明两个变量。在您的情况下,声明了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