質問

Per examples (e.g. getting panic() argument in defer function in GO lang) I've seen, I'm expecting this to work, but it isn't. When forcing an error, the err return string remains blank, although printing the err string shows the expected error.

I'm sure I'm missing something obvious, but can't find it. A little help?

// expected error example:
// chk, err := equal("a", map[string]string{"a"})
//
func Equal(a interface{}, b interface{}) (check bool, err string) {
    defer func() {
        if catch := recover(); catch != nil {
            check = false

            // this prints
            fmt.Printf("%v\n", catch)

            err = fmt.Sprint(catch)
        }
    }()

    return a == b, ""
}

BTW:

go version go1.2.1 linux/amd64
役に立ちましたか?

解決

As @nos pointed out, there's no panic, here.

This example works as expected:

package main

import "fmt"

func equal(a interface{}, b interface{}) (check bool, err string) {
    defer func() {
        if catch := recover(); catch != nil {
            check = false
            fmt.Printf("recover: %v\n", catch)
            err = fmt.Sprint(catch)
        } else {
            fmt.Printf("recover: none\n")
        }
    }()

    return a == b, ""
}

func main() {
    chk, err := equal("a", "a")
    fmt.Printf("a == a\n")
    fmt.Printf("chk: %v\n", chk)
    fmt.Printf("err: %v\n", err)
    fmt.Println()

    chk, err = equal("a", 1)
    fmt.Printf("a == 1\n")
    fmt.Printf("chk: %v\n", chk)
    fmt.Printf("err: %v\n", err)
    fmt.Println()

    chk, err = equal([]int{1}, []int{1})
    fmt.Printf("[]int{1}, []int{1}\n")
    fmt.Printf("chk: %v\n", chk)
    fmt.Printf("err: %v\n", err)
}

// Output:
//
// recover: none
// a == a
// chk: true
// err:
// recover: none
//
// a == 1
// chk: false
// err:
// recover: runtime error: comparing uncomparable type []int
//
// []int{1}, []int{1}
// chk: false
// err: runtime error: comparing uncomparable type []int
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top