2015-07-21 29 views
2

我是golang中的新成员,我来自php。从嵌入式结构体访问struct字段

我想定义一个结构验证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} 

是否有任何方式访问在验证结构领域,如Validate2()方法()方法?

回答

5

您不能从内部结构访问外部结构字段。只有外部的内部字段。你可以做的是构成:

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 
} 
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