>  기사  >  백엔드 개발  >  golang 인터페이스 전송

golang 인터페이스 전송

WBOY
WBOY원래의
2023-05-19 10:08:07459검색

유형 구현 원리

Golang은 정적으로 유형이 지정된 언어로서 인터페이스라는 매우 강력한 기능을 제공합니다. 이는 개발자가 코드 재사용성을 달성하는 데 도움이 될 뿐만 아니라 코드 구조를 파괴하지 않고 프로그램 기능을 확장할 수 있게 해줍니다.

Golang에서 인터페이스는 유형이지만 다른 유형과 달리 인터페이스 유형은 이러한 메소드를 구현하지 않고도 메소드 선언 세트를 포함할 수 있습니다. 이는 우리에게 큰 유연성을 제공합니다. 인터페이스 유형을 정의함으로써 일반적인 메소드 호출 메소드를 정의할 수 있으며, 이 호출 메소드는 인터페이스 유형과 연관되며 구현 유형과는 아무런 관련이 없습니다.

그러면 인터페이스 유형을 사용할 때 Golang은 이를 어떻게 구현 유형으로 변환합니까? 이 기본 구현 원리를 이해하기 전에 먼저 Golang의 유형 및 인터페이스 유형의 기본 개념을 이해하겠습니다.

Golang의 유형 및 인터페이스 유형

Golang의 유형은 값 유형과 참조 유형이라는 두 가지 범주로 나눌 수 있습니다.

  • 값 유형: 숫자 유형, 부울 유형, 배열 유형, 구조 유형 등
  • 참조 유형: 포인터 유형, 슬라이스 유형, 맵 유형, 찬 유형 등

값 유형은 변수가 메모리에 직접 저장된다는 의미이고, 참조 유형은 변수가 메모리의 다른 개체에 대한 포인터를 저장한다는 의미입니다. 값 유형의 경우 직접 비교할 수 있지만 참조 유형의 경우 등가 함수를 사용하여 비교를 수행해야 합니다.

Golang에서는 인터페이스 유형을 사용하여 모든 유형을 나타낼 수 있습니다. 인터페이스는 모든 유형의 데이터 값을 나타낼 수 있으므로 매우 유연한 유형입니다. 인터페이스 값은 인터페이스 값을 구현하는 모든 데이터를 저장할 수 있습니다. 따라서 인터페이스 유형을 사용하면 임의 유형의 데이터를 함수에 전달하거나 특정 객체 유형을 알지 못한 채 객체 데이터를 저장할 수 있습니다.

유형과 인터페이스 유형의 관계

Golang에서 유형은 하나 이상의 인터페이스를 구현할 수 있습니다. 인터페이스의 모든 메서드를 구현하는 형식은 인터페이스의 인스턴스화로 간주됩니다. 이 유형은 이 인터페이스를 구현하는 변수 유형으로 사용할 수 있습니다.

예를 들어, Area()라는 메소드가 있는 Shaper라는 인터페이스 유형이 있습니다.

type Shaper 인터페이스 {

Area() float64

}

Shaper 인터페이스 Area()를 구현하도록 Square 유형을 생성할 수 있습니다. 메소드:

type Square struct {

side float64

}

func (s *Square) Area() float64 {

return s.side * s.side

}

이러한 방식으로 Square 유형을 Shaper 유형의 인스턴스로 만들 수 있습니다. Square 유형의 면적을 계산하려면 Shaper 유형의 Area() 메서드를 사용하여 이 면적 값을 얻을 수 있습니다.

func main() {

square := &Square{10.0}
fmt.Println("Area of square:", square.Area())

}

여기에서 확인할 수 있습니다. Square 타입은 Shaper 타입의 Area() 메소드를 구현하여 Shaper 타입의 인스턴스로 사용할 수 있다는 점입니다. 인터페이스 유형은 여기서 일반적인 Area() 메소드를 제공하여 다양한 유형의 영역을 계산할 수 있으며 이 Area() 메소드의 구현은 구현 유형에 따라 결정됩니다.

유형 어설션이 필요한 이유는 무엇입니까?

이제 유형과 인터페이스 유형의 기본 사항을 이해했으므로 Golang이 인터페이스 유형을 구현 유형으로 변환하는 방법을 살펴보겠습니다.

인터페이스 유형의 변수를 생성할 때 이는 실제로 메서드 테이블에 대한 포인터(메소드 테이블, 가상 테이블 또는 Vtable이라고도 함)와 인터페이스 포인터를 구현하는 값에 대한 포인터라는 두 부분을 포함하는 데이터 구조입니다. . 메소드 테이블은 모든 메소드 함수 포인터의 목록이며, 각 포인터는 메소드 이름 및 유형과 연관되어 있습니다.

인터페이스 유형의 메소드를 호출하면 Golang은 먼저 해당 메소드가 메소드 테이블에 있는지 확인한 후 해당 메소드를 호출합니다. 일반적으로 Golang은 포인터 수신기를 사용하여 인터페이스 유형을 구현합니다. 이 방법은 값 수신기보다 효율적이고 호출자가 값 유형의 필드를 수정하는 것을 방지할 수 있기 때문입니다.

하지만 인터페이스 유형을 사용할 때 이를 구현 유형으로 변환해야 하는 경우가 있습니다. 이 경우 유형 어설션을 사용해야 합니다. 타입 어설션(Type Assertion)은 인터페이스 타입이 타겟 타입을 구현하는지 판단하여 타입 변환이 가능한지 판단하는 연산이다. 판단이 성공하면 유형 어설션은 대상 유형을 나타내는 값을 반환하고, 그렇지 않으면 0 값을 반환하고 예외를 발생시킵니다. 따라서 유형 주장을 하기 전에 유형 주장의 두 번째 반환 값을 사용하여 예외를 방지하기 위한 안전한 판단을 내려야 합니다.

다음 코드는 인터페이스 유형을 구현 유형으로 변환하는 방법을 보여줍니다.

func main() {

var shaper Shaper
square := &Square{10.0}
shaper = square                //将square类型转换成Shaper类型
s := shaper.(*Square)          //将shaper类型转换成Square类型
fmt.Println("Square side length:", s.side)

}

여기서는 Square 유형의 값을 Shaper 유형의 변수에 할당하여 Square 유형을 사용합니다. Shaper 유형으로 변환됩니다. 다시 변환해야 할 경우 유형 어설션을 사용하여 Shaper 유형을 Square 유형으로 변환할 수 있습니다.

요약

인터페이스 유형은 코드 재사용성과 확장성을 향상시킬 수 있는 Golang에서 매우 중요한 개념입니다. Golang에서는 인터페이스 유형과 유형 주장의 도움으로 인터페이스 유형을 구현 유형으로 변환할 수 있습니다. 유형 어설션은 더 큰 유연성을 제공하지만 예외를 방지하려면 사용 중에 유형 변환의 안전성에 주의를 기울여야 합니다.

위 내용은 golang 인터페이스 전송의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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