最佳实践,如何初始化自定义类型?

时间:2013-06-20 18:41:52

标签: go

我还不习惯去做事。 这里我有包装BidiMap的ClientConnectorPool类型。我应该如何初始化这种类型?这样我可以添加到我的bidiMap后话吗?我所有尝试做同样的事情都是hackish,我需要灵感,我可以为它实现一些make(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
}

1 个答案:

答案 0 :(得分: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函数来包装该结构的创建。

我不知道你需要在哪里检查nil。 make()不会返回nil,其余的是一个简单的struct literal。