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
Update-2
It's works, I not notice @GreatDharmatma return (err error)
It's my fault.
This's a Summary:
:=
used only if all of left variable not declare before-
if
a variable
have been declared before(like c.file).We need pre-declare
err
beforeos.OpenFile(path,os.O_CREATE | os.O_RDWR,0755)
var err error
Another way to solve this problem is use
named return value
as@GreatDharmatma
said.
From Golang docs
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.