首页 > 后端开发 > Golang > 正文

golang中的可变参数函数

王林
发布: 2024-02-12 15:42:06
转载
510 人浏览过

golang中的可变参数函数

问题内容

package main

import (
    "fmt"
)

type isum interface {
    sum() int
}

type sumimpl struct {
    num int
}

func (s sumimpl) sum() int {
    return s.num
}

func main() {

    nums := []int{1, 2}
    variadicexample1(nums...)

    impl1 := sumimpl{num: 1}
    impl2 := sumimpl{num: 2}

    variadicexample2(impl1, impl2)

    impls := []sumimpl{
        {
            num: 1,
        },
        {
            num: 2,
        },
    }
    variadicexample2(impls...)
}

func variadicexample1(nums ...int) {
    fmt.print(nums, " ")
    total := 0
    for _, num := range nums {
        total += num
    }
    fmt.println(total)
}

func variadicexample2(nums ...isum) {

    fmt.print(nums, " ")
    total := 0
    for _, num := range nums {
        total += num.sum()
    }
    fmt.println(total)
}
登录后复制

我在使用go语言中的变量函数时遇到一个问题。

当传递一个实现接口的结构作为参数时,单独的声明是可能的,但是你能告诉我为什么当它通过...传递时这是不可能的吗?

下面的代码出现错误。

variadicexample2(impls...)
登录后复制

我读过这篇文章

如何将接口参数传递给 golang 中的可变参数函数?

var impls []ISum
impls = append(impls, impl1)
impls = append(impls, impl1)
variadicExample2(impls...)
登录后复制

我发现上面的代码是可以的。

解决方法

sumimpl 切片不是 isum 切片。一个是结构体切片,另一个是接口切片。这就是为什么您无法将其传递给需要 []isum 的函数(即 ...isum)。

但是你可以这样做:

impls := []ISum{
        SumImpl{
            Num: 1,
        },
        SumImpl{
            Num: 2,
        },
    }
登录后复制

以上是golang中的可变参数函数的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!