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

Issue

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

Solution

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

Answered By – icza

Answer Checked By – Senaida (GoLangFix Volunteer)

Leave a Reply

Your email address will not be published.