2017-08-11 74 views
0

我想創建一個基本結構,它必須有方法,我想在子結構中使用這些方法。例如:Golang基礎結構來定義子結構中的方法

type Base struct { 
    Type string `json:"$type"` 
} 

func (b Base) GetJSON() ([]byte, error) { 
    return json.Marshal(b) 
} 

func (b Base) SetType(typeStr string) interface{} { 
    b.Type = typeStr 
    return b 
} 

在新的結構我想用這樣的:

type Auth struct { 
    Base 
    Username 
    Password 
} 

,並呼籲在主這些方法:

func main() { 
    a := Auth{ 
    Username: "Test", 
    Password: "test", 
    } 
    a = a.SetType("testtype").(Auth) 
    j, _ := a.GetJSON() 
} 

在的setType情況下,我得到了由接口{}導致的恐慌不是Auth類型,它是Base類型。 在GetJSON的情況下,我得到了一個有關類型的JSON,但只有類型。

問題是否有解決方案,我想解決什麼問題?

+1

'返回b.Type = typeStr'不是一個有效的GO語句。如果這就是你想要做的,Base不會有'用戶名'和'密碼'字段。 Go中沒有繼承。 – JimB

+0

我建議完全從Go角度重新考慮您的設計。 Go不是一種面向對象的語言。它沒有繼承,也沒有接口之外的多態。 – Adrian

+0

是的,我知道,但是人們如何解決給定的問題,我有359個結構都使用相同的方法,我應該把它們寫入所有的? – PumpkinSeed

回答

1

正如在評論中提到的,嵌入是不是繼承,但組成,所以你可能必須要麼:

  • 重新考慮你的設計中使用的工具去有可用
  • 度假村廣泛黑客得到你想要的

在你是顯示了特定情況下的結果(試圖讓GetJSON()也包括外部結構的領域,這裏是得到那個工作的一個可行的辦法,不需要許多變化(只是創建結構),當存儲指針到基地外的結構:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Base struct { 
    Type string  `json:"$type"` 
    selfP interface{} // this will store a pointer to the actual sub struct 
} 

func (b *Base) SetSelfP(p interface{}) { 
    b.selfP = p 
} 

func (b *Base) GetJSON() ([]byte, error) { 
    return json.Marshal(b.selfP) 
} 

func (b *Base) SetType(typeStr string) { 
    b.Type = typeStr 
} 

type Auth struct { 
    Base 
    Username string 
    Password string 
} 

func main() { 
    a := &Auth{ 
     Username: "Test", 
     Password: "test", 
    } 
    a.SetSelfP(a) // this line does the trick 
    a.SetType("testtype") 
    j, _ := a.GetJSON() 
    fmt.Println(string(j)) 
} 

遊樂場鏈接:https://play.golang.org/p/npuy6XMk_t

+0

謝謝,這正是我正在尋找的。 – PumpkinSeed