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?,F在,您希望將參數限制為某些輸入的函數(這是不可能的);但是你可以做些什么來限制它只接受類型,并傳遞創建的任何變量。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 關注
- 95 瀏覽
添加回答
舉報