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

3 回复

哦,移除后重新执行 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 生成的。

以下是解决方案:

  1. 确保 stringer 工具已正确安装

    go install golang.org/x/tools/cmd/stringer[@latest](/user/latest)
    
  2. 检查 stringer 的导入路径:确保你的代码中 go:generate 指令使用的是正确的导入路径。你的代码中已经使用了 //go:generate stringer -type=Suit,这是正确的。

  3. 显式指定常量值:为了避免 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}
  1. 运行 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() 方法,可以在打印时显示对应的字符串名称。

回到顶部