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

Time:03-17

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.

  • Related