Golang Go语言中关于可变参数解包的问题

发布于 1周前 作者 gougou168 来自 Go语言

Golang Go语言中关于可变参数解包的问题

rWGtw8.jpg

如图,我想往一个接口 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

10 回复

看上去只能循环解引用加进去

更多关于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, &amp;SayHiImpl{})<br> s = append(s, impls[0])<br> s = append(s, impls...)<br>}<br>

这么玩

#4 嗯,现在就是这么搞的,就是觉得这种 单个元素能 append,slice 解包不能 append 有点反直觉,头大

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语言中的可变参数解包问题。

回到顶部