Fungsi parameter berubah dalam golang

王林
Lepaskan: 2024-02-12 15:42:06
ke hadapan
535 orang telah melayarinya

Fungsi parameter berubah dalam golang

Kandungan soalan

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)
}
Salin selepas log masuk

Saya menghadapi masalah apabila menggunakan fungsi pembolehubah dalam bahasa go.

Apabila menghantar struct yang melaksanakan antara muka sebagai hujah, pengisytiharan berasingan adalah mungkin, tetapi bolehkah anda beritahu saya mengapa ini tidak mungkin apabila ia diluluskan melalui... ?

Terdapat ralat dalam kod di bawah.

variadicexample2(impls...)
Salin selepas log masuk

Saya membaca artikel ini

Bagaimana untuk menghantar parameter antara muka kepada fungsi variadic dalam golang?

var impls []ISum
impls = append(impls, impl1)
impls = append(impls, impl1)
variadicExample2(impls...)
Salin selepas log masuk

Saya dapati kod di atas adalah ok.

Penyelesaian

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

Tetapi anda boleh melakukan ini:

impls := []ISum{
        SumImpl{
            Num: 1,
        },
        SumImpl{
            Num: 2,
        },
    }
Salin selepas log masuk

Atas ialah kandungan terperinci Fungsi parameter berubah dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan