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

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

藏色散人
藏色散人앞으로
2020-08-21 13:17:352971검색

에서 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 기술 기사를 보려면 go 언어 튜토리얼

칼럼을 방문하세요! 🎜

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

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