如图,我想往一个接口 slice 里,append 进一个 impl slice 的所有元素,为什么单个 append 就可以,用...的方式就不行啊,这种我只能 for 循环依次 append 了吗?求大佬解惑
type ISayHi interface {
Hi()
}
type SayHiImpl struct {
}
func (s *SayHiImpl) Hi() {
fmt.Println("Hi")
}
func main() {
s := make([]ISayHi, 0)
impls := make([]*SayHiImpl, 0)
impls = append(impls, &SayHiImpl{})
s = append(s, impls[0])
s = append(s, impls...)
}
1
assiadamo 2020-12-25 16:31:21 +08:00
看上去只能循环解引用加进去
|
2
vasil 2020-12-25 16:33:48 +08:00
s 和 impls 的类型不一致
|
3
westoy 2020-12-25 16:42:55 +08:00
s = append(s, s[:]...)
|
4
gochat 2020-12-25 16:48:05 +08:00 1
```go
type ISayHi interface { Hi() } type SayHiImpl struct { } func (s *SayHiImpl) Hi() { fmt.Println("Hi") } func main() { s := make([]ISayHi, 0) impls := make([]ISayHi, 0) impls = append(impls, &SayHiImpl{}) s = append(s, impls[0]) s = append(s, impls...) } ``` 这么玩 |
5
asAnotherJack OP @gochat #4 嗯,现在就是这么搞的,就是觉得这种 单个元素能 append,slice 解包不能 append 有点反直觉,头大
|
6
pigmen 2020-12-25 16:55:49 +08:00
mark 下不太懂,用什么单个可以,unpack 不行
|
7
keepeye 2020-12-25 16:56:25 +08:00
|
8
keepeye 2020-12-25 16:58:46 +08:00 2
简单来说,append 需要编译器支持,而编译器不支持复杂的转换。比如 []*SayHiImpl 转换成 []ISayHi 需要 O(N)的复杂度,是不支持的.
至于单个为什么可以,因为转换单个只要 O(1) |
9
ZSeptember 2020-12-25 17:06:51 +08:00 1
go 不支持 Covariance 。
append 的第二个参数是 []ISayHi,[]*SayHiImpl 并不是[]ISayHi 的子类型。 |