>백엔드 개발 >Golang >인터페이스 매개변수와 함께 함수를 전달할 때 Go의 유형 시스템이 '호환되지 않는 오류'를 생성하는 이유는 무엇입니까?

인터페이스 매개변수와 함께 함수를 전달할 때 Go의 유형 시스템이 '호환되지 않는 오류'를 생성하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-01 12:21:10468검색

Why Does Go's Type System Produce

인터페이스 매개변수 호환 오류가 있는 func 입력

문제:
인수로 전달된 함수를 호출할 때 인터페이스{}를 준수하는 값을 취하는 유형 func에 오류가 발생합니다. 예를 들어 다음 코드는 다음과 같습니다.

type myfunc func(x interface{})

func a(num int) {
}

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

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

설명:
이 오류는 Go에서 유형 시스템의 가변성을 지원하지 않기 때문에 발생합니다. 가변성은 매개변수 인수에 하위 유형과 상위 유형을 사용할 때의 유연성을 나타냅니다. Go의 인터페이스는 다른 유형 시스템과 달리 가변성을 지원하지 않습니다.

주어진 예에서 int는 인터페이스{}를 허용하는 함수에 전달될 수 있지만 이는 호환되는 func(int)로 확장되지 않습니다. func(인터페이스{})를 사용합니다. 이는 Go의 인터페이스가 공변적이지 않기 때문입니다.

해결 방법:
해결 방법으로 익명 함수를 통해 인터페이스{}를 구현하여 인터페이스를 기대하는 함수에 함수를 전달할 수 있습니다. :

package main

import "fmt"

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

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

func main() {
    foo(func(n int) int {
        return n + 2
    })
}

이 접근 방식은 func(int)int가 구현한다는 사실을 활용합니다. 인터페이스{}.

프로그래밍 언어의 다양성에 대한 추가 정보를 얻으려면 Wikipedia 기사와 아래 링크된 게시물을 살펴보세요.

  • [Variance(컴퓨터 과학)](https:/ /en.wikipedia.org/wiki/Variance_(computer_science))
  • [일반의 차이 프로그래밍](https://www.fluentcpp.com/2018/11/29/variance-in-generic-programming/)

위 내용은 인터페이스 매개변수와 함께 함수를 전달할 때 Go의 유형 시스템이 '호환되지 않는 오류'를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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