2015-07-21 80 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