2014-12-30 37 views
1

我有自定義類型Int64ArrayChannelChannelList,如:在golang中,如何嵌入自定義類型?

type Int64Array []int64 

func (ia *Int64Array) Scan(src interface{}) error { 
    rawArray := string(src.([]byte)) 
    if rawArray == "{}" { 
    *ia = []int64{} 
    } else { 
    matches := pgArrayPat.FindStringSubmatch(rawArray) 
    if len(matches) > 1 { 
     for _, item := range strings.Split(matches[1], ",") { 
     i, _ := strconv.ParseInt(item, 10, 64) 
     *ia = append(*ia, i) 
     } 
    } 
    } 
    return nil 
} 

func (ia Int64Array) Value() (driver.Value, error) { 
    var items []string 
    for _, item := range ia { 
    items = append(items, strconv.FormatInt(int64(item), 10)) 
    } 
    return fmt.Sprintf("{%s}", strings.Join(items, ",")), nil 
} 

type Channel int64 

type ChannelList []Channel 

如何能夠將Int64ArrayChannelList,這樣我可以調用它ScanValue方法呢?我試過如下:

type ChannelList []Channel { 
    Int64Array 
} 

,但我發現語法錯誤。重要的是要確保ChannelList項目的類型爲Channel,如果這不可能通過嵌入我可能會創建獨立的功能,由ChannelListInt64Array調用。

回答

3

在結構中找到匿名(或嵌入字段)(請參見struct type),而不是類型別名(或「type declaration」)。

您不能在另一個類型聲明中嵌入類型聲明。

另外,如「Go: using a pointer to array」的答案所示,您不應該使用指向切片的指針,直接使用切片本身(passed by value)。

Wessie友好地指出in the comments(ia *Int64Array) Scan()使用指向切片的指針以改變由所述切片引用的底層數組。
我寧願返回另一個切片,而不是改變現有的切片。
話雖這麼說,在Golang Code Review確實提到:

如果接收者是一個structarrayslice和任何元素是一個指針的東西,可能會變異,喜歡一個指針接收器,因爲它會讓讀者更清楚的意圖。

+0

'Value'已經正常通過,'Scan'需要一個指針,因爲它**用'append'改變**片段。你的最後一段是錯誤的,當你看到一個指向切片的指針時,似乎已經習慣於總是包含它。 – Wessie

+0

@Wessie同意了(回答編輯)。名稱「掃描」讓我感到困惑。我沒有預料到似乎是隻讀操作('Scan')來改變它的接收器上的任何東西。 – VonC

相關問題