如何在Go中传递指向特定接口片的指针?

如何在Go中传递指向特定接口片的指针?,go,interface,polymorphism,Go,Interface,Polymorphism,我希望通过将指向特定接口片段的指针传递给函数,并更新函数内部的片段来实现多模态。它与接口{} 主程序包 进口( “fmt” “strconv” ) 类型估价师接口{ value()字符串 } 类型myInt func(i myInt)value()字符串{ 返回strconv.Itoa(int(i)) } func值(VAL接口{}){ res,ok:=vals.(*[]myInt) 如果!好的{ 恐慌(“错误类型”) } *res=[]myInt{1,2,3} } func main(){ v

我希望通过将指向特定接口片段的指针传递给函数,并更新函数内部的片段来实现多模态。它与
接口{}

主程序包
进口(
“fmt”
“strconv”
)
类型估价师接口{
value()字符串
}
类型myInt
func(i myInt)value()字符串{
返回strconv.Itoa(int(i))
}
func值(VAL接口{}){
res,ok:=vals.(*[]myInt)
如果!好的{
恐慌(“错误类型”)
}
*res=[]myInt{1,2,3}
}
func main(){
var a[]myInt
值(&a)
对于u,b:=范围a{
fmt.Println(b.value())
}
}

但是,如果我尝试将
接口{}
更改为指向特定接口切片的指针,则它不起作用:

主程序包
进口(
“fmt”
“strconv”
)
类型估价师接口{
value()字符串
}
类型myInt
func(i myInt)value()字符串{
返回strconv.Itoa(int(i))
}
func值(VAL*[]估价师){
*VAL=[]myInt{1,2,3}
}
func main(){
var a[]myInt
值(&a)
对于u,b:=范围a{
fmt.Println(b.value())
}
}

返回错误

./prog.go:19:8: cannot use []myInt literal (type []myInt) as type []valuer in assignment
./prog.go:24:9: cannot use &a (type *[]myInt) as type *[]valuer in argument to values

我做错了什么?

从@kostix提供的见解中,我可以看出我不能同时保留这两个方面——对非空接口的限制,以及传递具体类型切片的指针的简单性。因此,如果我确实希望将输出保持为非空接口的一部分,我可以做类似的事情:

主程序包
进口(
“fmt”
“strconv”
)
类型估价师接口{
value()字符串
}
类型myInt
func(i myInt)value()字符串{
返回strconv.Itoa(int(i))
}
func values()[]估价师{
res:=make([]估价师,3)
c:=[]myInt{1,2,3}
对于i,v:=范围c{
res[i]=v
}
返回res
}
func main(){
a:=值()
对于u,b:=范围a{
fmt.Println(b.value())
}
}

这将使api更易于使用,并允许输出具有非空接口的多态性


使用这种方法给用户带来的一个不便是,如果用户希望使用接口未指定的具体类型的方法,他们将不得不“取消绑定”切片的成员。

类型
[]myInt
[]valuer
不同。你不能将一个分配给另一个,这就是你要做的。我确实从错误消息@icza中了解了很多,但我不明白的是如何使它工作。这基本上是FAQ条目的(反向版本)。吸收的主要思想是,任何类型的值和接口类型的值都有不同的内存布局。我建议您阅读99%的正确率,尽管有点脏。唯一“使其工作”的方法是创建所需类型的切片,
[]valuer
,其长度与源切片相同,
[]myInt
,然后将源切片中的每个元素逐个复制到新的元素。每个元素分配将创建一个接口类型的值,
valuer
,并在其中创建一个被分配的
myInt
值的(副本)。让我重申一下,Go1.x既没有“泛型”,也没有C++风格的模板。Go的接口与泛型/模板语言中的“类型参数”不同。您无法将引用传递给切片,因为Go中没有引用。不适用于切片,也不适用于任何其他类型。您的困惑可能源于带来无效的术语和模型?