如何在 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"
}
}
它在 args1
和 args2
下显示一条红线,上面写着
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
这是我的代码:
func ToSomething(arg *string) string {
switch arg {
case nil:
return "something1"
case "args1":
return "something2"
case "args2":
return "something3"
default:
return "something4"
}
}
它在 args1
和 args2
下显示一条红线,上面写着
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