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

How to use switch case with nullable string (*string) in Golang?

这是我的代码:

func ToSomething(arg *string) string {
    switch arg {
    case nil:
        return "something1"
    case "args1":
        return "something2"
    case "args2":
        return "something3"
    default:
        return "something4"
    }
}

它在 args1args2 下显示一条红线,上面写着

Invalid case '"args1"' in switch on 'arg' (mismatched types 'string' and '*string')

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

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

每个案例的类型必须与 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"
    }
}

这里是 playground.

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

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

因此,您不应使用 arg 作为 switch 表达式,而应在 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