在golang中,如何嵌入自定义类型?

时间:2014-12-30 09:09:13

标签: go

我有自定义类型Int64ArrayChannelChannelList,如:

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,以便我可以在其上调用ScanValue方法?我尝试了以下方法:

type ChannelList []Channel {
    Int64Array
}

但是我遇到了语法错误。重要的是确保ChannelList项的类型为Channel,如果通过嵌入无法实现这一点我可能只创建由ChannelList和{{{{}}调用的独立函数1}}。

1 个答案:

答案 0 :(得分:3)

在结构中找到匿名(或嵌入字段)(请参阅struct type),而不是在类型别名(或" type declaration")中找到。

您不能在另一个类型声明中嵌入类型声明。

另外,正如" Go: using a pointer to array"的答案所示,您不应该使用指针进行切片,直接使用切片(passed by value)。

Wessiein the comments指出(ia *Int64Array) Scan()使用指向切片的指针,以便改变所述切片引用的基础数组。
我宁愿返回另一片而不是改变现有片 话虽如此,Golang Code Review确实提到了:

  

如果接收器是structarrayslice并且其任何元素是指向可能发生变异的内容的指针,则更喜欢指针接收器,因为它将使意图对读者更清楚。