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)
}

在围棋语言中使用变量函数时,我有一个问题.

当将实现接口的 struct 作为参数传递时,可以单独声明,但您能告诉我为什么在传递它时不能...?

下面的代码中出现错误.

variadicExample2(impls...)

我读到了这个

How to pass an interface argument to a variadic function in Golang?

var impls []ISum
impls = append(impls, impl1)
impls = append(impls, impl1)
variadicExample2(impls...)

我发现上面的代码是可能的.

推荐答案

SumImpl个切片不是ISum个切片.一个是 struct 片,另一个是接口片.这就是为什么不能将它传递给需要[]ISum(即...ISUm)的函数.

但你可以这样做:

impls := []ISum{
        SumImpl{
            Num: 1,
        },
        SumImpl{
            Num: 2,
        },
    }

Go相关问答推荐

从Kafka到Clickhouse的实时消费数据

为什么在GO中打印变量会导致堆栈溢出?

仅呈现一个模板的GIN Web应用程序

使用ciph.AEAD.Seal()查看内存使用情况

在Mac中使用uname获取处理器体系 struct 时,在为AMD64构建Go二进制时出现错误结果

使用Digitorus/pdfsign在GO(Golang)中签署pdf文件

如何解析Go-Gin多部分请求中的 struct 切片

如何确定泛型类型在运行时是否可比较?

Github Actions Go lambda 项目不同的 sha256sums

hyperledger fabric - go:在 $PATH 中找不到可执行文件

为什么 net/http 不遵守超过 30 秒的超时持续时间?

加载 docker 镜像失败

加密/椭圆:try 在无效点上进行操作

无法将 graphql-ws 连接到 gqlgen

在反向 GORM 中创建查询有一个关系

此代码如何生成内存对齐切片?

无法访问 Go 模块导入的远程存储库

没有堆栈跟踪的 go 程序崩溃是什么意思?

如何在 Windows 中使用 github.com/AllenDang/giu 和 github.com/gordonklaus/portaudio 构建 GO 程序

golang 如何从字符串中查找表情符号?