我有自定义类型Int64Array
,Channel
和ChannelList
,如:
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
如何将Int64Array
嵌入到ChannelList
,以便我可以在其上调用Scan
和Value
方法?我尝试了以下方法:
type ChannelList []Channel {
Int64Array
}
但是我遇到了语法错误。重要的是确保ChannelList
项的类型为Channel
,如果通过嵌入无法实现这一点我可能只创建由ChannelList
和{{{{}}调用的独立函数1}}。
答案 0 :(得分:3)
在结构中找到匿名(或嵌入字段)(请参阅struct
type),而不是在类型别名(或" type declaration")中找到。
您不能在另一个类型声明中嵌入类型声明。
另外,正如" Go: using a pointer to array"的答案所示,您不应该使用指针进行切片,直接使用切片(passed by value)。
Wessie请in the comments指出(ia *Int64Array) Scan()
使用指向切片的指针,以便改变所述切片引用的基础数组。
我宁愿返回另一片而不是改变现有片
话虽如此,Golang Code Review确实提到了:
如果接收器是
struct
,array
或slice
并且其任何元素是指向可能发生变异的内容的指针,则更喜欢指针接收器,因为它将使意图对读者更清楚。