Golang Go语言中关于可变参数解包的问题
Golang Go语言中关于可变参数解包的问题
如图,我想往一个接口 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…)
}
更多关于Golang Go语言中关于可变参数解包的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
s 和 impls 的类型不一致
s = append(s, s[:]…)
go<br>type ISayHi interface {<br> Hi()<br>}<br><br>type SayHiImpl struct {<br>}<br><br>func (s *SayHiImpl) Hi() {<br> fmt.Println("Hi")<br>}<br><br>func main() {<br> s := make([]ISayHi, 0)<br> impls := make([]ISayHi, 0)<br> impls = append(impls, &SayHiImpl{})<br> s = append(s, impls[0])<br> s = append(s, impls...)<br>}<br>
这么玩
mark 下不太懂,用什么单个可以,unpack 不行
简单来说,append 需要编译器支持,而编译器不支持复杂的转换。比如 []*SayHiImpl 转换成 []ISayHi 需要 O(N)的复杂度,是不支持的.
至于单个为什么可以,因为转换单个只要 O(1)
go 不支持 Covariance 。
append 的第二个参数是 []ISayHi,[]*SayHiImpl 并不是[]ISayHi 的子类型。
在Go语言中,处理可变参数(variadic parameters)时,我们通常使用省略号(...
)来定义一个函数可以接受不定数量的参数。例如,func myFunc(args ...int)
表示 myFunc
可以接受任意数量的 int
类型参数。
解包这些可变参数时,你可以直接将它们作为切片(slice)处理。Go语言会自动将传递给可变参数的实际参数打包成一个切片。在函数内部,你可以像操作普通切片一样操作这些参数。
例如:
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
func main() {
fmt.Println(sum(1, 2, 3, 4)) // 输出 10
}
在这个例子中,sum
函数接受一个可变数量的 int
参数,并将它们存储在一个名为 nums
的切片中。然后,函数遍历这个切片,将所有元素相加并返回结果。
此外,如果你需要将一个现有的切片传递给一个接受可变参数的函数,可以直接传递,无需任何特殊处理。例如:
slice := []int{1, 2, 3, 4}
fmt.Println(sum(slice...)) // 使用 slice... 解包切片作为可变参数传递
这里,slice...
语法用于将切片 slice
解包为可变参数,传递给 sum
函数。希望这能帮助你更好地理解Go语言中的可变参数解包问题。