为了账号安全,请及时绑定邮箱和手机立即绑定

Go 中的自定义字符串类型

Go 中的自定义字符串类型

Go
慕婉清6462132 2022-08-01 10:22:26
如何在 Go 中创建限制为特定字符串值列表的自定义类型?例如:type Suit = "Spade" | "Diamond" | "Club" | "Heart"
查看完整描述

2 回答

?
慕容708150

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


查看完整回答
反对 回复 2022-08-01
?
翻翻过去那场雪

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)

}


查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号