如何仅给定接口示例来初始化对象列表?

How to initialize a list of objects given only an interface sample?

我正在用 Google Go 编写数据库接口。它需要 encoding.BinaryMarshaler 个对象来保存并将它们保存为 []byte 切片,并将数据加载到 encoding.BinaryUnmarshaler 到 return 它:

func (db *DB) Get(bucket []byte, key []byte, destination encoding.BinaryUnmarshaler) (encoding.BinaryUnmarshaler, error) {

我想实现能够一次加载任意长度的 encoding.BinaryUnmarshaler 片段(例如 "load all data from a bucket X")。我希望该函数能够在事先不知道要加载多少对象的情况下加载任意数量的数据对象,因此我不希望最终用户向我传递一个要填充的切片。相反,我使用 encoding.BinaryUnmarshaler 示例对象来了解我正在处理的结构:

func (db *DB) GetAll(bucket []byte, sample encoding.BinaryUnmarshaler) ([]encoding.BinaryUnmarshaler, error) {

我在编写此代码时 运行 遇到的问题是,我不确定如何初始化给定对象的新实例,因为我不知道我正在处理什么对象,只知道它符合的接口。我尝试做的是:

tmp:=new(reflect.TypeOf(sample))

但这只是导致了一个错误。

如何在不知道它是什么结构的情况下创建一个新对象,而是使用一个示例对象?

您必须将 reflect.Newreflect.TypeOf 一起使用:

tmp := reflect.New(reflect.TypeOf(sample))

http://play.golang.org/p/-ujqWtRzaP