2015-07-02 31 views
-1

是否可以訪問在類型的基礎類型中聲明的方法?例如,我想要一個ResourceSet能夠調用我的Set類型的AddId方法。可用於類型聲明中結構的訪問方法

參見:http://play.golang.org/p/Fcg6Ryzb67

package main 

type Resource struct { 
    Id uint32 
} 

type Set map[uint32]struct{} 

func (s Set) AddId(id uint32) { 
    s[id] = struct{}{} 
} 

type ResourceSet Set 

func (s ResourceSet) Add(resource Resource) { 
    id := resource.Id 
    s.AddId(id) 
} 

func main() { 
    resource := Resource{Id: 1} 

    s := ResourceSet{} 
    s.Add(resource) 
} 

我得到的錯誤是:

s.AddId undefined (type ResourceSet has no field or method AddId) 

回答

2

新命名類型的全部要點是有一個新的空方法集。

嵌入是一個不同的故事,並添加一些語法糖來調用嵌入類型的方法。

+0

好的,這是有用的知道。那麼,那有什麼意義呢?什麼是用例? – Wex

+1

@Wec:用例是:您想要一個帶有特殊方法集的類型,但您可以用另一個指定類型(其方法不需要類型的方法)表示類型狀態。 – Volker

0

這可以使用embedding解決:

type ResourceSet struct { 
    Set 
} 

func (s ResourceSet) Add(resource Resource) { 
    id := resource.Id 
    s.AddId(id) 
} 

func main() { 
    resource := Resource{Id: 1} 

    s := ResourceSet{Set{}} 
    s.Add(resource) 
} 

您還可以創建一個initializing constructor到使ResourceSet創建過程更簡單:

func NewResourceSet() { 
    return ResourceSet{Set{}} 
} 

func main() { 
    s := NewResourceSet() 
}