2 回答

TA贡献1831条经验 获得超4个赞
Go 没有代数数据类型 (ADT)。您需要的是 ADT 中的“总和”类型。例如,Swift 和 Rust 中有枚举来支持它们。Go 没有泛型(尚无);没有选项,结果类型也是如此。
虽然你想做的事情可以在Go中使用不同的方式来实现,但我喜欢使用const而不是空接口或类型检查或反射。我认为const会更快,可读性更强。以下是我将要走的路。如果这是您想要的,则可以从方法返回字符串,而不是打印。
package main
import "fmt"
type Suit int
const (
Spade Suit = iota + 1
Diamond
Club
Heart
)
type Card struct {
suit Suit
no int
}
func (c *Card) PrintSuit() {
switch c.suit {
case Spade:
fmt.Println("Its a Spade")
case Diamond:
fmt.Println("Its a Diamond")
case Club:
fmt.Println("Its a Club")
case Heart:
fmt.Println("Its a Heart")
default:
fmt.Println("Unknown!")
}
}
func main() {
c := Card{suit: Diamond}
c.PrintSuit()
}
您可以在方法中接受外部函数,例如,如果处理逻辑是外部的。PrintSuit

TA贡献2065条经验 获得超14个赞
定义的类型别名,即 .是其基础类型为字符串的类型。stringSuitSuit
现在,创建一些 Suit 类型的常量。在下面的颂歌中, , , 的类型是 Suit。现在,您希望将参数限制为某些输入的函数(这是不可能的);但是你可以做些什么来限制它只接受类型,并传递创建的任何变量。SpadeDiamondClubHeartSuitconst
// Define new type alias for string
type Suit string
const (
Spade Suit = "Spade"
Diamond Suit = "Diamond"
Club Suit = "Club"
Heart Suit = "Heart"
)
// function f only accepts parameter of type "Suit"
func f(s Suit) {
fmt.Println(s)
}
func main() {
// Call the function f with Spade
f(Spade)
}
- 2 回答
- 0 关注
- 81 浏览
添加回答
举报