>백엔드 개발 >Golang >인터페이스 매개변수를 허용하는 함수에 특정 매개변수 유형이 있는 함수를 전달할 때 Go가 오류를 보고하는 이유는 무엇입니까?

인터페이스 매개변수를 허용하는 함수에 특정 매개변수 유형이 있는 함수를 전달할 때 Go가 오류를 보고하는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-25 13:03:10423검색

Why Does Go Report an Error When Passing a Function with a Specific Parameter Type to a Function Accepting an Interface{} Parameter?

인터페이스 매개변수 비호환성이 있는 유형 Func

인터페이스에 맞는 모든 값을 허용하는 함수 유형을 정의할 때 마주치는 것이 혼란스러울 수 있습니다. 해당 사양과 일치하는 것으로 보이는 함수를 호출하면 오류가 발생합니다.

다음을 고려하세요. 예:

type myfunc func(x interface{})

func a(num int) {
    return
}

func b(f myfunc) {
    f(2)
    return
}

func main() {
    b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b
    return
}

Go의 인터페이스가 불변성을 나타내기 때문에 오류가 발생합니다. 즉, int가 인터페이스를 기대하는 함수에 전달될 수 있지만{}의 경우에는 그렇지 않습니다. func(int) 및 func(인터페이스{}).

Go에서 호환되는 유형의 함수는 동일한 매개변수와 반환 유형을 가져야 합니다. func(int) 및 func(interface{})는 이 요구 사항을 충족하지 않으므로 Go에서는 두 가지가 호환되지 않는 것으로 인식합니다.

이 문제를 해결하려면 다음 접근 방식을 사용하는 것이 좋습니다.

package main

import "fmt"

func foo(x interface{}) {
    fmt.Println("foo", x)
}

func add2(n int) int {
    return n + 2
}

func main() {
    foo(add2)
}

이 예시에서는 func(int)int가 인터페이스{}를 기대하는 함수에 전달됩니다. 이는 func(int)int가 지정된 입력 및 반환 유형을 가진 단일 메서드를 요구하는 인터페이스{}를 구현하기 때문에 허용됩니다.

Go의 가변성에 대한 자세한 설명은 다음 Wikipedia 문서를 참조하세요. 제공된 답변에 링크된 주제와 블로그 게시물입니다.

위 내용은 인터페이스 매개변수를 허용하는 함수에 특정 매개변수 유형이 있는 함수를 전달할 때 Go가 오류를 보고하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.