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
CodePudding user response:
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
CodePudding user response:
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.