Reputation: 3421
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
before os.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.
Upvotes: 1
Views: 3635
Reputation: 677
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
Upvotes: 2