Golang中Stringer常量Spade无值问题探讨
Golang中Stringer常量Spade无值问题探讨 我的代码:
//go:generate stringer -type=Suit
package deck
import "fmt"
// Suit represents card's category.
type Suit uint8
const (
Spade Suit = iota
Diamond
Club
Heart
Joker
)
当我执行 go generate 时,本应生成一些文件。然而,我却得到了以下错误:
$ go generate
stringer: no value for constant Spade
main.go:1: running "stringer": exit status 1
也许是 stringer 包中有什么变化了?
更多关于Golang中Stringer常量Spade无值问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html
哦,移除后重新执行 go get 就成功了。
不确定之前是什么原因导致失败。
更多关于Golang中Stringer常量Spade无值问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我将您的代码复制到剪贴板并运行了以下命令:
go get golang.org/x/tools/cmd/stringer
cat > ./deck.go
# 鼠标中键粘贴,然后按 Ctrl+D
go generate
并且没有出现那个错误。deck.Suit.String 已正确生成。您能否尝试删除您的 golang.org/x/tools/cmd/stringer 包,然后重新执行 go get 并再次尝试?
根据你的代码和错误信息,问题在于 stringer 工具无法识别 Spade 常量的值。这通常是因为 stringer 工具需要常量值在编译时是确定的,而你的代码中 Spade 的值是通过 iota 生成的。
以下是解决方案:
-
确保
stringer工具已正确安装:go install golang.org/x/tools/cmd/stringer[@latest](/user/latest) -
检查
stringer的导入路径:确保你的代码中go:generate指令使用的是正确的导入路径。你的代码中已经使用了//go:generate stringer -type=Suit,这是正确的。 -
显式指定常量值:为了避免
iota可能引起的问题,可以显式指定常量的值。修改你的代码如下:
//go:generate stringer -type=Suit
package deck
import "fmt"
// Suit represents card's category.
type Suit uint8
const (
Spade Suit = 0
Diamond Suit = 1
Club Suit = 2
Heart Suit = 3
Joker Suit = 4
)
或者,如果你仍想使用 iota,可以确保 iota 从0开始,并且所有常量都是同一类型:
//go:generate stringer -type=Suit
package deck
import "fmt"
// Suit represents card's category.
type Suit uint8
const (
Spade Suit = iota
Diamond
Club
Heart
Joker
)
// 确保所有常量都是Suit类型
var _ = []Suit{Spade, Diamond, Club, Heart, Joker}
- 运行
go generate:修改代码后,再次运行go generate:
go generate ./...
如果问题仍然存在,可以尝试以下步骤:
-
检查
stringer工具的版本是否过时。 -
清理并重新生成:
go clean -cache go generate -
如果使用模块,确保模块文件正确:
go mod tidy
示例代码修改后,stringer 应该能正确生成 Suit_string.go 文件,内容类似:
// Code generated by "stringer -type=Suit"; DO NOT EDIT.
package deck
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[Spade-0]
_ = x[Diamond-1]
_ = x[Club-2]
_ = x[Heart-3]
_ = x[Joker-4]
}
const _Suit_name = "SpadeDiamondClubHeartJoker"
var _Suit_index = [...]uint8{0, 5, 12, 16, 21, 26}
func (i Suit) String() string {
if i >= Suit(len(_Suit_index)-1) {
return "Suit(" + strconv.FormatInt(int64(i), 10) + ")"
}
return _Suit_name[_Suit_index[i]:_Suit_index[i+1]]
}
这样,Suit 类型就会实现 String() 方法,可以在打印时显示对应的字符串名称。

