无法在函数中定义变量 - Go

时间:2014-09-24 20:22:06

标签: go

我遇到一个简单的任务,我有点麻烦。

我有一个函数,它格式化一个包含小时和分钟值的结构,并将其格式化为字符串。

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值

2 个答案:

答案 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() {}

参考文献:

The Go Programming Language Specification

Declarations and scope

Type declarations

Variable declarations

Short variable declarations