Rumah >pembangunan bahagian belakang >Golang >Fungsi parameter berubah dalam golang

Fungsi parameter berubah dalam golang

王林
王林ke hadapan
2024-02-12 15:42:06567semak imbas

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

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

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

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

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

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam