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
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With