我在尝试理解我公司使用的代码。我对Go语言还很陌生,已经完成了官方网站上的教程。然而,空接口(interface{})让我有点困惑。从网上各种信息中,我知道空接口可以容纳任何类型。但是,我很难理解代码库,尤其是一些函数。我不会在这里发布所有内容,只发布其中所用到的最小函数。请谅解!
以下是 package.json 的一部分:
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
则是不同的包。在domain
包中,有一个名为Application
的结构体。接下来要介绍的两个结构体则属于views
包:
type Data struct {
Id string `json:"id"`
Type string `json:"type"`
Attributes interface{} `json:"attributes"`
}
type Request struct {
Data *Data `json:"data"`
}
以下是 package.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
}
现在,我了解到在views包中的struct Data中,Application被设置为一个空接口的类型。之后,在同一包中创建了指向变量data的Request指针。
我有以下几个疑问:
this
关键字在Go中是什么意思?写this * RequestHandler
有什么目的?- 在Go中,可以通过指定所有成员的值将结构体初始化并赋值给变量。然而,在这里,对于结构体Data,只分配了空接口值,并没有分配其他两个字段的值?
- 将Application结构体分配给空接口的优点是什么?这是否意味着我可以直接使用接口变量来使用结构体成员?
- 有人可以帮我弄清楚这句话的含义吗?
json.NewDecoder(r.Body).Decode(request)
?
虽然我知道这太多了,但我很难理解Go中接口的含义。请帮帮我!