3 回答

TA贡献1780条经验 获得超4个赞
我想我明白了。
在这一行
github.com/DataDog/datadog-go/statsd.(*Client).Event(0x0, 0xc8200c7ec8, 0x0, 0x0)
第一个
0x0
是*Client
,它确实为零。0xc8200c7ec8
是*Event
以下
0x0, 0x0
代表类型的返回值error
。error
,根据http://blog.golang.org/error-handling-and-go,是一个接口。根据http://research.swtch.com/interfaces,接口存储为两个指针。第一个指针指向接口中存储的类型信息,第二个指针指向接口中存储的数据。
我编写了以下程序来向自己演示不同的函数签名如何出现在堆栈跟踪中:
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但没有参数或返回值,输出包含:
main.(*Y).bam(0xc82002df48)
当foo被调用时,它作用于*Ya*X作为参数,但没有返回值,输出包含:
main.(*Y).foo(0xc820033f30, 0xc820033f30)
当bar被调用时,它作用于*Y,将 a*X作为参数,并返回 a *Y,输出包含:
main.(*Y).bar(0xc820033f30, 0xc820033f30, 0x40fb46)
当baz被调用时,它作用于*Y,*X作为参数,并返回一个error(它是一个接口),输出包含:
main.(*Y).baz(0xc820033f38, 0xc820033f38, 0x0, 0x0)

TA贡献1846条经验 获得超7个赞
你所拥有的是一个 nil 指针取消引用。(除非您使用的是 package unsafe
,您可能不应该接触它,所以我假设您不是。)
看起来e
参数 tofunc (c *Client) Event(e *Event) error
是nil
在调用 from 时github.com/some/path/server/http.go:86
。
- 3 回答
- 0 关注
- 137 浏览
添加回答
举报