你有什么是零指针解除引用。 (除非你使用包裹 unsafe ,你可能不应该碰,所以我假设你不是。)
unsafe
它看起来像 e 论证 func (c *Client) Event(e *Event) error 是 nil 来自的时候 github.com/some/path/server/http.go:86 。
e
func (c *Client) Event(e *Event) error
nil
github.com/some/path/server/http.go:86
感谢@twotwotwo的评论,我想我想出来了。
在这一行
github.com/DataDog/datadog-go/statsd.(*Client).Event(0x0, 0xc8200c7ec8, 0x0, 0x0)
0x0
*Client
0xc8200c7ec8
*Event
0x0, 0x0
error
我编写了以下程序来向自己演示不同的函数签名如何出现在堆栈跟踪中:
package main import "errors" type X struct { i int } type Y struct { } func (y *Y) foo(x *X) { panic("panic in foo") } func (y *Y) bar(x *X) (*Y) { panic("panic in bar") return y } func (y *Y) baz(x *X) (error) { panic("panic in baz") return errors.New("error in baz") } func (y *Y) bam() { panic("panic in bam") } func main() { y := new(Y) x := new(X) // comment out the ones you don't want to check y.foo(x) y.bar(x) y.baz(x) y.bam() }
什么时候 bam 被称为,作用于 *Y 但是没有参数或返回值,输出包含:
bam
*Y
main.(*Y).bam(0xc82002df48)
什么时候 foo 被称为,作用于 *Y 并采取 *X 作为参数,但没有返回值,输出包含:
foo
*X
main.(*Y).foo(0xc820033f30, 0xc820033f30)
什么时候 bar 被称为,作用于 *Y 拿一个 *X 作为参数,并返回一个 *Y ,输出包含:
bar
main.(*Y).bar(0xc820033f30, 0xc820033f30, 0x40fb46)
什么时候 baz 被称为,作用于 *Y ,需要 *X 作为参数,并返回一个 error (这是一个接口),输出包含:
baz
main.(*Y).baz(0xc820033f38, 0xc820033f38, 0x0, 0x0)