我想了解我公司使用的代码。我是新来的,我已经在他们的官方网站上阅读了教程。但是,我很难在空接口周围,即接口{}。从各种来源在线,我发现空接口可以容纳任何类型。但是,我很难搞清楚代码库,特别是一些功能。我不会在这里发布整个内容,而只是发布它的最小函数。请多多包涵!
Function (I am trying to understand):
func (this *RequestHandler) CreateAppHandler(rw http.ResponseWriter, r *http.Request) *foo.ResponseError {
var data *views.Data = &views.Data{Attributes: &domain.Application{}}
var request *views.Request = &views.Request{Data: data}
if err := json.NewDecoder(r.Body).Decode(request); err != nil {
logrus.Error(err)
return foo.NewResponsePropogateError(foo.STATUS_400, err)
}
requestApp := request.Data.Attributes.(*domain.Application)
requestApp.CreatedBy = user
设置一些上下文,RequestHandler
是在与此代码相同的包中定义的结构。 domain
和views
是单独的包。 Application是包域中的结构。以下两个结构是包视图的一部分:
type Data struct {
Id string `json:"id"`
Type string `json:"type"`
Attributes interface{} `json:"attributes"`
}
type Request struct {
Data *Data `json:"data"`
}
以下是json包的一部分:
func NewDecoder(r io.Reader) *Decoder {
return &Decoder{r: r}
}
func (dec *Decoder) Decode(v interface{}) error {
if dec.err != nil {
return dec.err
}
if err := dec.tokenPrepareForDecode(); err != nil {
return err
}
if !dec.tokenValueAllowed() {
return &SyntaxError{msg: "not at beginning of value"}
}
// Read whole value into buffer.
n, err := dec.readValue()
if err != nil {
return err
}
dec.d.init(dec.buf[dec.scanp : dec.scanp+n])
dec.scanp += n
// Don't save err from unmarshal into dec.err:
// the connection is still usable since we read a complete JSON
// object from it before the error happened.
err = dec.d.unmarshal(v)
// fixup token streaming state
dec.tokenValueEnd()
return err
}
type Decoder struct {
r io.Reader
buf []byte
d decodeState
scanp int // start of unread data in buf
scan scanner
err error
tokenState int
tokenStack []int
}
现在,我明白了,在包视图中的struct Data中,Application被设置为空接口的类型。之后,创建指向同一包中的Request的指针,该指针指向可变数据。
我有以下疑问:
this
关键字在Go中到底意味着什么?写this * RequestHandler
?Data
,只分配空接口值,而不分配其他两个字段的值? json.NewDecoder(r.Body).Decode(request)
?虽然我知道这太多了,但我很难弄清楚Go中接口的含义。请帮忙!
答案 0 :(得分:1)
this
不是go中的关键字;任何变量名都可以在那里使用。这被称为接收器。以这种方式声明的函数必须像thing.func(params)
一样调用,其中" thing"是接收器类型的表达式。在函数内,接收器设置为thing
。
结构文字不必包含所有字段(或其中任何字段)的值。未明确设置的任何字段的类型都将具有零值。
正如您所说,空接口可以采用任何类型的值。要使用类型interface{}
的值,您可以使用 type assertion 或 type switch 来确定值的类型,或者可以使用反射使用该值而无需具有特定类型的代码。
你不明白这个陈述的具体内容是什么? json
是声明函数NewDecoder
的包的名称。调用该函数,然后在该返回值上调用Decode
函数(由NewDecoder
的返回值的类型实现)。
您可能需要查看Effective Go和/或The Go Programming Language Specification以获取更多信息。