我有一个接口Model
,该接口由struct实现Person
。
要获取模型实例,我具有以下辅助函数:
func newModel(c string) Model {
switch c {
case "person":
return newPerson()
}
return nil
}
func newPerson() *Person {
return &Person{}
}
上面的方法允许我返回正确类型的Person实例(以后可以使用相同的方法轻松添加新模型)。
当我尝试执行类似的操作以返回模型切片时,出现错误。码:
func newModels(c string) []Model {
switch c {
case "person":
return newPersons()
}
return nil
}
func newPersons() *[]Person {
var models []Person
return &models
}
去抱怨: cannot use newPersons() (type []Person) as type []Model in return argument
我的目标是回到请求任何机型的切片(是否[]Person
,[]FutureModel
,[]Terminator2000
,W /
E)。我缺少什么,如何正确实施这样的解决方案?
简短的答案是您是正确的。结构的片段不等于该结构实现的接口的片段。
A []Person
和A []Model
具有不同的内存布局。这是因为它们是切片的类型具有不同的内存布局。A
Model
是接口值,这意味着在内存中它是两个字的大小。一个单词代表类型信息,另一个单词代表数据。A
Person
是一个结构,其大小取决于它包含的字段。为了从转换[]Person
为[]Model
,您将需要遍历数组并为每个元素进行类型转换。
由于此转换是O(n)操作,并且会导致创建新的切片,因此Go拒绝隐式地执行此操作。您可以使用以下代码明确地做到这一点。
models := make([]Model, len(persons))
for i, v := range persons {
models[i] = Model(v)
}
return models
就像dskinner指出的那样,您很可能需要一个切片指针而不是一个指向切片的指针。通常不需要指向切片的指针。
*[]Person // pointer to slice
[]*Person // slice of pointers
我有一个接口,它是由struct实现的。 要获取模型实例,我有以下助手函数: 上述方法允许我返回一个正确类型的Person实例(以后可以使用相同的方法轻松添加新模型)。 当我尝试执行类似的操作以返回模型片段时,我得到了一个错误。代码: Go抱怨:中使用newPeople()(type[]Person)作为type[]Model 我的目标是返回所请求的任何模型类型的切片(无论是,,,w/e)。我遗漏
问题内容: 给定您具有接受功能的场景。如果确定是切片,我如何在该切片上? 前往游乐场示例:http://play.golang.org/p/DNldAlNShB 问题答案: 好吧,我曾经使用过,然后如果它是一个切片,则可以调用,并在该值上调用以在索引处获取切片和元素的。我认为您将无法使用范围操作来做到这一点。 前往游乐场示例:http : //play.golang.org/p/gQhCTiwPA
问题内容: 我在遍历包含接口切片的接口切片时遇到麻烦。 通过尝试使用返回JSON数据的API调用产生了此问题。返回的数据很多,根据请求的不同,结构也有很大不同。API文档中也没有JSON响应的结构,因此我试图实现一些用于处理任意JSON响应的方法。 当前,当进行初始调用时,将其放入map [string] interface {}中,然后运行switch语句以确定每个元素的类型,当遇到一片接口时就
问题内容: 我很好奇拆包切片并将其作为参数发送给可变参数函数。 假设我们有一个带有可变参数的函数: 如果我们不想传入一个接口,它就可以工作,那么我们是否拆包都没关系: 如果我们有一片片的话,那会很棘手。在这里,编译器不允许我们传递解压版本: 错误提示: 在解包参数中不能将sliceOfSlices(类型[] [] interface {})用作类型[] interface {} 我不知道为什么会这
问题内容: 我有两个接口,和。碰巧包括。最后,我有一个具体的实现(称为),根据定义,它也实现了。 例如: 由于要求和实施,它也令人满意。 如果我尝试跨函数传递单个项目,则效果很好。但是,如果我尝试对Expecting函数进行切片,它将失败。 例: 如果我可以将传递给,为什么我不能传递给,我将如何纠正它? https://play.golang.org/p/QOREQJTQhD上的实际实现只是取消注
取一个list或tuple的部分元素是非常常见的操作。比如,一个list如下: >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] 取前3个元素,应该怎么做? 笨办法: >>> [L[0], L[1], L[2]] ['Michael', 'Sarah', 'Tracy'] 之所以是笨办法是因为扩展一下,取前N个元素就没辙了。 取前N个元素