我遇到一个简单的任务,我有点麻烦。
我有一个函数,它格式化一个包含小时和分钟值的结构,并将其格式化为字符串。
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)
}
我得到的错误是:
syntax error: unexpected name, expecting semicolon or newline or }
代表上面的h string
行。
知道这里发生了什么吗?我想我会简单地使用临时变量来格式化int值
答案 0 :(得分:5)
您需要声明:
var h string
var m string
在影响:=
和=
的值时不要使用h
而是使用m
(或者您只能在内部范围内定义这些值,而不是重复使用变量之前定义的)
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)
}
完整示例:play.golang.org
输出:Hello, playground 02:08
答案 1 :(得分:0)
声明String
方法变量一次(var
)。不要使用短变量声明(:=
)重新声明它们。例如,
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() {}
参考文献: