I am having a little trouble with what I though was a simple task.
I have a function that formats a struct that holds an hour and a minute value and formats it into a string.
type Clock struct {
h int
m int
}
func (c *Clock) String() string {
h string
m string
if c.m < 10 {
m := fmt.Sprintf("0%d", c.m)
} else {
m := fmt.Sprintf("%d", c.m)
}
if c.h < 10 {
h := fmt.Sprintf("0%d", c.h)
} else {
h := fmt.Sprintf("%d", c.h)
}
return fmt.Sprintf("%s:%s", h, m)
}
The error I am getting is:
syntax error: unexpected name, expecting semicolon or newline or }
for the line h string
above.
Any idea what is going on here? I figured I would simple use a temporary variable to format the int values
You need to declare:
var h string
var m string
And do not use :=
but =
when affecting values to h
and m
(or you would define those only in their inner scope, instead of reusing the variables defined before)
if c.m < 10 {
m = fmt.Sprintf("0%d", c.m)
} else {
m = fmt.Sprintf("%d", c.m)
}
if c.h < 10 {
h = fmt.Sprintf("0%d", c.h)
} else {
h = fmt.Sprintf("%d", c.h)
}
Full example: play.golang.org
Output: Hello, playground 02:08
Declare the String
method variables once (var
). Do not redeclare them with short variable declarations (:=
). For example,
package main
import "fmt"
type Clock struct {
h int
m int
}
func (c *Clock) String() string {
var (
h string
m string
)
if c.m < 10 {
m = fmt.Sprintf("0%d", c.m)
} else {
m = fmt.Sprintf("%d", c.m)
}
if c.h < 10 {
h = fmt.Sprintf("0%d", c.h)
} else {
h = fmt.Sprintf("%d", c.h)
}
return fmt.Sprintf("%s:%s", h, m)
}
func main() {}
References: