>  기사  >  백엔드 개발  >  Golang 함수 메소드 값 및 메소드 표현 구현 방법

Golang 함수 메소드 값 및 메소드 표현 구현 방법

WBOY
WBOY원래의
2023-05-16 20:40:53730검색

Golang 함수의 메서드 값과 메서드 표현 구현 방법

Golang에서 함수는 일급 시민입니다. 이는 함수가 구문적으로 다른 값과 동일하며 변수에 저장되고, 함수에 전달되고, 함수에서 반환될 수 있음을 의미합니다. 이 외에도 Golang은 유형의 동작을 확장하는 방법도 제공합니다. 메소드는 유형에 존재하며 유형의 필드 및 메소드에 액세스할 수 있는 특수 함수입니다. 이번 글에서는 Golang 함수의 메소드 값과 메소드 표현 구현 방법에 대해 논의하겠습니다.

메서드 값과 메서드 표현식

먼저, 메서드 값과 메서드 표현식을 살펴보겠습니다. 메서드 값은 수신기가 바인딩된 함수 값입니다. 이는 일반 함수와 유사하지만 함수가 정의될 ​​때 지정되는 수신기도 포함합니다. 따라서 메소드 값은 일반 함수처럼 전달되고 저장될 수 있지만 수신자에 대한 참조도 유지합니다.

다음은 예입니다.

type Rect struct {
  width, height float64
}

func (r Rect) Area() float64 {
  return r.width * r.height
}

func main() {
  r := Rect{3, 4}

  // 获取 Rect 类型的 Area 方法值
  f := r.Area
  // 调用方法值
  fmt.Println(f())
}

위의 예에서는 Rect라는 유형을 정의하고 해당 메소드에 대해 Area라는 유형을 정의합니다. 이 Area 메서드 수신자는 Rect 유형이므로 Rect 인스턴스에서만 호출할 수 있습니다. main 함수에서 Rect 인스턴스 r를 생성하고 해당 Area 메서드 값을 얻은 후 f라는 변수입니다. f는 함수 값이므로 일반 함수처럼 호출할 수 있지만 r 인스턴스에 대한 참조도 유지하므로 Enter r. Rect 的类型,并为它定义了一个名为 Area 的方法。这个 Area 方法接收者是 Rect 类型,因此它只能被 Rect 的实例调用。在 main 函数中,我们创建了一个 Rect 实例 r,并获取了它的 Area 方法值,将其存储在名为 f 的变量中。由于 f 是一个函数值,我们可以像调用普通函数一样调用它,但它还保留了对 r 实例的引用,因此它会在调用时自动传入 r

类似方法值,方法表达式是绑定了接收者的函数表达式。它与方法值类似,但是它不依赖于任何实例,可以在没有实例时被调用。方法表达式使用类型名作为接收者。

下面是使用方法表达式的例子:

type Rect struct {
  width, height float64
}

func (r Rect) Area() float64 {
  return r.width * r.height
}

func main() {
  // 获取 Rect 类型的 Area 方法表达式
  f := Rect.Area
  fmt.Println(f(Rect{3, 4}))
}

在上面的例子中,我们使用 Rect.Area 获取 Rect 类型的 Area 方法表达式。由于方法表达式不依赖于任何实例,因此我们可以直接传递一个 Rect 实例,调用时会自动将它作为接收者。

实现方法的方式

在 Golang 中,有两种方式来实现方法:值接收者和指针接收者。值接收者是将值作为接收者传递给方法,指针接收者是将指针作为接收者传递给方法。值接收者会对方法中的字段进行值拷贝,而指针接收者会将指针作为接收者传递,以便在方法中直接修改字段的值。

下面是采用值接收者的例子:

type Rect struct {
  width, height float64
}

func (r Rect) Scale(factor float64) {
  r.width *= factor
  r.height *= factor
}

func main() {
  r := Rect{3, 4}
  r.Scale(2)
  fmt.Println(r.width, r.height)
}

在上面的例子中,我们定义了名为 Scale 的值接收者方法。它接收一个浮点数 factor,并将 Rect 的宽度和高度乘以它。在调用方法时,由于使用了值接收者,r 实例的值被拷贝到方法中,并对它进行修改。因此,即使在方法中修改了宽度和高度,我们在函数的外部仍然可以访问原始值。

下面是采用指针接收者的例子:

type Rect struct {
  width, height float64
}

func (r *Rect) Scale(factor float64) {
  r.width *= factor
  r.height *= factor
}

func main() {
  r := &Rect{3, 4}
  r.Scale(2)
  fmt.Println(r.width, r.height)
}

在上面的例子中,我们定义了名为 Scale 的指针接收者方法。它接收一个浮点数 factor,并将 Rect 的宽度和高度乘以它。在调用方法时,由于使用了指针接收者,r

메서드 값과 유사하게, 메서드 표현식은 수신자에 바인딩된 함수 표현식입니다. 메소드 값과 유사하지만 어떤 인스턴스에도 종속되지 않으며 인스턴스가 없을 때 호출할 수 있습니다. 메서드 표현식은 유형 이름을 수신자로 사용합니다.

다음은 메소드 표현식을 사용하는 예입니다.

rrreee

위 예에서는 Rect.Area를 사용하여 RectArea를 가져옵니다. /code> > 메소드 표현. 메서드 표현식은 어떤 인스턴스에도 의존하지 않으므로 Rect 인스턴스를 직접 전달할 수 있으며 호출 시 자동으로 수신자로 사용됩니다. 🎜🎜메서드 구현 방법🎜🎜Golang에서 메소드를 구현하는 방법에는 값 수신자와 포인터 수신자의 두 가지 방법이 있습니다. 값 수신기는 값을 수신기로 메서드에 전달하고, 포인터 수신기는 포인터를 수신기로 메서드에 전달합니다. 값 수신자는 메소드의 필드 값을 복사하는 반면, 포인터 수신자는 포인터를 수신자로 전달하여 메소드에서 필드 값을 직접 수정할 수 있습니다. 🎜🎜다음은 값 수신자를 사용하는 예입니다. 🎜rrreee🎜위 예에서는 Scale이라는 값 수신자 메서드를 정의했습니다. 부동 소수점 숫자 인수를 수신하고 Rect의 너비와 높이에 이를 곱합니다. 메서드가 호출되면 값 수신기를 사용하여 r 인스턴스의 값이 메서드에 복사되고 수정됩니다. 따라서 메소드 내에서 너비와 높이가 수정되더라도 함수 외부의 원래 값에 계속 액세스할 수 있습니다. 🎜🎜다음은 포인터 수신기를 사용하는 예입니다. 🎜rrreee🎜위 예에서는 Scale이라는 포인터 수신기 메서드를 정의했습니다. 부동 소수점 숫자 인수를 수신하고 Rect의 너비와 높이에 이를 곱합니다. 메서드가 호출되면 포인터 수신기를 사용하여 r 인스턴스에 대한 포인터가 메서드에 전달되고 해당 필드를 직접 수정할 수 있습니다. 따라서 수정된 값은 함수 외부에서도 액세스할 수 있습니다. 🎜🎜결론🎜🎜Golang 함수의 메소드 값과 메소드 표현식은 코드의 가독성과 재사용성을 크게 향상시킬 수 있습니다. 또한 메서드를 구현할 때 코드의 세부 사항에 따라 값 수신기 또는 포인터 수신기 사용 중에서 선택해야 합니다. 이상은 Golang 함수의 메소드 값과 메소드 표현 구현 방법에 대한 소개입니다. 여러분의 개발 작업에 도움이 되길 바랍니다. 🎜

위 내용은 Golang 함수 메소드 값 및 메소드 표현 구현 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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