>백엔드 개발 >Golang >Go 언어의 메소드에 대한 자세한 설명

Go 언어의 메소드에 대한 자세한 설명

藏色散人
藏色散人앞으로
2020-08-27 13:29:442790검색

Go 언어의 방법에 대한 이해를 소개하고 도움이 필요한 친구들에게 도움이 되기를 바랍니다!

Go 언어의 메소드에 대한 자세한 설명go 메소드

정의

메소드는 특수 수신자 매개변수, 즉 func와 메소드 이름 사이에 메소드 수신자가 있는 함수입니다.
func (s Student) GetName() string  {
    return s.name}func (s *Student) SetName(name string) {
    s.name = name}

수신자 유형이 포인터인 멤버 메서드를 포인터 메서드라고 부를 수 있고, 수신기 유형이 포인터가 아닌 멤버 메서드를 값 메서드라고 합니다.

객체를 수정해야 하는 경우 포인터(참조로 전달)를 사용해야 합니다. 그렇지 않으면 유형을 리터럴(값으로 전달)로 선언하면 됩니다. 또한 모든 메서드 호출 시 값을 복사하지 마세요.

type Integer intfunc (a *Integer) Increase(i Integer) {
    *a = *a + i}func main() {
    var a Integer = 2
    var b Integer = 2
    //a.Increase(b)
    //(&a).Increase(b)
    (*Integer).Increase(&a, b)
    fmt.Println(a)}
이 메소드는 Integer 클래스에 속하지 않고 Integer를 가리키는 포인터 유형에 속합니다. 메소드를 호출할 때 인스턴스에서 직접 증가 메소드를 호출할 수 있는 이유는 Go 언어 컴파일 단계가 a를 자동으로 변환합니다. 해당 포인터 유형은 &a이므로 실제 호출 코드는 (&a).Increase(b)입니다.

은 실제로 구문 설탕입니다&a,所以真正调用的代码是 (&a).Increase(b)

其实是语法糖

type A struct {
  name string}func (a A) Name() string {
  a.name = "Hi! " + a.name  return a.name}func main() {
  a := A{name: "test"}

  fmt.Println(a.Name())

  fmt.Println(A.Name(a))}

a.Name() 其实就是 A.Name(a)

func NameOfA(a A) string {
  a.name = "Hi! " + a.name  return a.name}func main() {
  t1 := reflect.TypeOf(A.Name)
  t2 := reflect.TypeOf(NameOfA)

  fmt.Println(t1 == t2)// true}

a.Name()은 실제로 A.Name(a)에 대한 구문 설탕이며, 변수 a는 소위 메소드 수신자 .

rrreeeGo 언어의 함수 유형은 매개변수 및 반환 값에만 관련되어 있으므로 이 두 유형의 동일성은 메서드가 본질적으로 일반 함수이고 수신자가 암시적 첫 번째 매개변수

임을 증명할 수 있습니다. 🎜

위 내용은 Go 언어의 메소드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제