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

如何在 Golang 中使用带有可空字符串 (*string) 的 switch case?

如何在 Golang 中使用带有可空字符串 (*string) 的 switch case?

Go
米脂 2022-11-23 15:31:00

这是我的代码:


func ToSomething(arg *string) string {

    switch arg {

    case nil:

        return "something1"

    case "args1":

        return "something2"

    case "args2":

        return "something3"

    default:

        return "something4"

    }

}

它在下方显示一条红线args1,args2上面写着


“arg”开关中的无效大小写“args1”(不匹配类型“string”和“*string”)


有谁知道在 golang 中正确使用带有可为空字符串 (*string) 的 switch case 吗?


这是一个围棋游乐场:https ://go.dev/play/p/0TaeXSEIt06


查看完整描述

2 回答

?
慕桂英3389331

TA贡献1745条经验 获得超8个赞

由于arg是类型*string,您必须*string在case分支中列出值。


但!您显然想要匹配指向的string值,因此列出*string值不是您想要的:检查指针是否相等。


因此,您不应该使用argasswitch表达式,而应该case像这样在分支上提供合理的条件:


func ToSomething(arg *string) string {

    switch {

    case arg == nil:

        return "something1"

    case *arg == "args1":

        return "something2"

    case *arg == "args2":

        return "something3"

    default:

        return "something4"

    }

}

测试它:


ptr := func(s string) *string { return &s }


fmt.Println(ToSomething(nil))

fmt.Println(ToSomething(ptr("args1")))

fmt.Println(ToSomething(ptr("args2")))

fmt.Println(ToSomething(ptr("xx")))

输出(在Go Playground上尝试):


something1

something2

something3

something4


查看完整回答
反对 回复 5天前
?
手掌心

TA贡献1661条经验 获得超3个赞

每个案例的类型必须与 相同arg。在您的示例arg中,*string每个案例都是string。


你可以取消引用arg:


func ToSomething(arg *string) string {

    if arg == nil {

        return "something1"

    }

    switch *arg {

    case "args1":

        return "something2"

    case "args2":

        return "something3"

    default:

        return "something4"

    }

}

这里是操场。


查看完整回答
反对 回复 5天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信