从嵌入式struct访问struct字段

时间:2015-07-21 11:16:52

标签: go

我是Golang的新手,我来自php。

我想在结构上定义一个方法来验证http请求。但是我在访问struct字段时遇到了一些问题。

有我的代码。

package main

import "log"

type ReqAbstract struct{}

func (r *ReqAbstract) Validate() error {
    log.Printf("%+v", r)
    return nil
}
func (r *ReqAbstract) Validate2(req interface{}) error {
    log.Printf("%+v", req)
    return nil
}

type NewPostReq struct {
    ReqAbstract
    Title string
}

func main() {
    request := &NewPostReq{Title: "Example Title"}

    request.Validate()
    request.Validate2(request)
}

当我运行此代码时,我得到低于结果

2015/07/21 13:59:50 &{}
2015/07/21 13:59:50 &{ReqAbstract:{} Title:Example Title}

有没有办法在Validate()方法上访问struct字段,如Validate2()方法?

2 个答案:

答案 0 :(得分:8)

您无法从内部结构访问外部结构字段。只有外部的内场。你能做的就是写作:

type CommonThing struct {
    A int
    B string
}

func (ct CommonThing) Valid() bool {
    return ct.A != 0 && ct.B != ""
}

type TheThing struct {
    CommonThing
    C float64
}

func (tt TheThing) Valid() bool {
    return tt.CommonThing.Valid() && tt.C != 0
}

答案 1 :(得分:3)

您可以通过指向自己定义归档

package main

import (
    "log"
)

type ReqAbstract struct{
    selfPointer interface{}
}

func (r *ReqAbstract) Assign(i interface{}) {
    r.selfPointer = i
}

func (r *ReqAbstract) Validate() error {
    log.Printf("%+v", r.selfPointer)
    return nil
}
func (r *ReqAbstract) Validate2(req interface{}) error {
    log.Printf("%+v", req)
    return nil
}

type PostReq struct {
    ReqAbstract
    Title string
}

func NewPostReq(title string) *PostReq {
    pr := &PostReq{Title:title}
    pr.Assign(pr)
    return pr
}

func main() {
    request := NewPostReq("Example Title")

    request.Validate()
    request.Validate2(request)
}

这将输出:

2009/11/10 23:00:00 &{ReqAbstract:{selfPointer:0x10438180} Title:Example Title} 2009/11/10 23:00:00 &{ReqAbstract:{selfPointer:0x10438180} Title:Example Title}

检查playground