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