英文:
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
下面显示了一条红线,上面写着:
在
arg
的switch
语句中,无效的case
'args1'(类型不匹配:'string'和'*string')
有人知道如何在golang中正确使用可空字符串(*string)的switch
语句吗?
这是一个Go Playground链接:https://go.dev/play/p/0TaeXSEIt06
英文:
Here is my code:
func ToSomething(arg *string) string {
switch arg {
case nil:
return "something1"
case "args1":
return "something2"
case "args2":
return "something3"
default:
return "something4"
}
}
It shows a red line under args1
and args2
that says
> Invalid case '"args1"' in switch on 'arg' (mismatched types 'string'
> and '*string')
anyone knows to use switch case with nullable string (*string) properly in golang?
Here is a go playground: https://go.dev/play/p/0TaeXSEIt06
答案1
得分: 3
由于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
英文:
Since arg
is of type *string
, you'd have to list values of *string
in the case
branches.
But! You obviously want to match the pointed string
values, so listing *string
values is not what you want: that checks for pointer equality.
So instead you should not use arg
as the switch
expression, but provide sensible conditions on the case
branches like this:
func ToSomething(arg *string) string {
switch {
case arg == nil:
return "something1"
case *arg == "args1":
return "something2"
case *arg == "args2":
return "something3"
default:
return "something4"
}
}
Testing it:
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")))
Output (try it on the Go Playground):
something1
something2
something3
something4
答案2
得分: 2
每个case必须与arg
的类型相同。在你的例子中,arg
是*string
类型,而每个case是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链接。
英文:
Each case must be the same type as arg
. In your example, arg
is *string
and each case is string
.
You could dereference arg
:
func ToSomething(arg *string) string {
if arg == nil {
return "something1"
}
switch *arg {
case "args1":
return "something2"
case "args2":
return "something3"
default:
return "something4"
}
}
Here is the playground.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论