我是一支从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已被初始化,错误了一个新变量。
我必须使用第二种方式吗?
我觉得第一种方法并不优雅。
更新1
当我使用@GreatDharmatma方法时。
Golang告诉我Unresolved variable err
Update-2
这是可行的,我没有注意到@GreatDharmatma返回(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
可以指定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 ...
这是无效的。