首页 > 解决方案 > Golang 短变量声明显示错误未解决

问题描述

我是新来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 方法时。

高朗告诉我Unresolved variable err

在此处输入图像描述


更新 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

文档命名变量

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”标识符列表 = 表达式列表。

所以,

x, y:=值

等同于

变量 x, y = 值

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

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

这是无效的。

谢谢。问题结束

标签: go

解决方案


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

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

这应该工作得很好

在此处输入图像描述


推荐阅读