1

我仍然不习惯这种做事的方式。这里我有包装 BidiMap 的类型 ClientConnectorPool。我应该如何初始化这种类型?这样我就可以添加到我的 bidiMap 后记?我所做的所有尝试都是骇人听闻的,我需要灵感,我可以为它实现某种 om 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
}
4

1 回答 1

3

您不能为 make() 定义自定义函数。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,剩下的就是一个简单的结构字面量。

于 2013-06-20T18:50:52.107 回答