2013-06-20 55 views
1

我還是不習慣去做事的方式。 這裏我有一個包裝BidiMap的ClientConnectorPool類型。我應該如何初始化這種類型?這樣我可以在我的bidiMap中添加後綴?我所有的嘗試都是這樣做的,我需要靈感,我可以爲它做些什麼(ClientConnectorPool)函數嗎?最佳做法,如何初始化自定義類型?

在我的腦袋就應該是這樣的,但我所有的解決方案就像是代碼15行,以避免零指針錯誤:d

CC = make(ClientConnectorPool) 
CC.Add("foo","bar") 

代碼:

package main 

import() 

type ClientConnectorPool struct { 
    Name string 
    ConnectorList BidirMap 
} 

func (c ClientConnectorPool) Add(key, val interface{}){ 
    c.ConnectorList.Add(key,val) 
} 


type BidirMap struct { 
    left, right map[interface{}]interface{} 
} 

func (m BidirMap) Add(key, val interface{}) { 
    if _, inleft := m.left[key]; inleft { 
     delete(m.left, key) 
    } 
    if _, inright := m.right[val]; inright { 
     delete(m.right, val) 
    } 
    m.left[key] = val 
    m.right[val] = key 
} 

回答

3

不能定義自定義函數make()。僅對切片,地圖和頻道(以及具有這些表示的自定義類型)進行製作。

地道Go將有一個NewClientConnectorPool函數(在下面縮寫爲NewPool)創建並返回它。

func NewPool(name string) ClientConnectorPool { 
    return ClientConnectorPool{ 
    Name: name, 
    ConnectorList: BidirMap{ 
     left: make(map[interface{}]interface{}), 
     right: make(map[interface{}]interface{}), 
    }, 
    } 
} 

你也可以有一個NewBidirMap功能包裝了結構的創建。

雖然我看不到你需要檢查的地方。 make()不會返回零,其餘的是一個簡單的結構文字。