English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang 기본 튜토리얼

Golang 제어문

Golang 함수 & 메서드

Golang 구조체

Golang 슬라이스 & 배열

Golang 문자열(String)

Golang 포인터

Golang 인터페이스

Golang 동기

Golang 예외(Error)

Golang 다른 항목

Go 언어 메서드(Method)

Go 언어는 메서드를 지원합니다. Go 메서드는 Go 함수와 유사하지만, 메서드는 수신자 파라미터를 포함하는 점이 다릅니다. 수신자 파라미터의 도움으로 이 메서드는 수신자의 속성에 접근할 수 있습니다. 여기서 수신자는 구조체 타입이나 비구조체 타입일 수 있습니다. 메서드를 코드에서 생성할 때 수신자와 수신자 타입은 같은 패키지에 있어야 하며, 다른 패키지에서 이미 정의된 수신자 타입(int, string 등 내장 타입 포함)을 메서드 내에서 정의할 수는 없습니다. 이를 시도하면 컴파일러는 오류를 발생시킵니다.

문법:

func(reciver_name Type) method_name(parameter_list)(return_type){
    // 코드
}

여기서는 메서드 내에서 수신자에 접근할 수 있습니다.

구조체 타입 수신자 메서드

Go 언어에서는 수신자가 구조체 타입인 메서드를 정의할 수 있습니다. 다음 예제와 같이 메서드 내에서 이 수신자에 접근할 수 있습니다:

package main 
  
import "fmt"
  
//Author 구조체
type author struct { 
    name string 
    branch string 
    particles int
    salary int
} 
  
//수신자 메서드 
func(a author) show() { 
  
    fmt.Println("저자 이름: ", a.name) 
    fmt.Println("부서 이름: ", a.branch) 
    fmt.Println("출판된 기사: ", a.particles) 
    fmt.Println("급여: ", a.salary) 
} 
  
func main() { 
  
    //초기화 값
    //Author 구조체
    res := author{ 
        이름: 	"Sona", 
        부서: 	"CSE", 
        파티클스: 203, 
        급여:    34000, 
    } 
  
    //메서드 호출
    res.show() 
}

출력:

저자 이름: 	Sona
부서 이름: 	CSE
출판된 기사:  203
급여:  34000

비구조화된 타입 리시버의 메서드

Go 언어에서는 타입과 메서드 정의가 같은 패키지에 존재하면 비구조화된 타입 리시버를 사용하여 메서드를 생성할 수 있습니다. 그러나 다른 패키지(예: int, string 등)에 존재하면 컴파일러는 오류를 발생시킵니다. 이는 다른 패키지에서 정의된 것들이기 때문입니다.

package main 
  
import "fmt"
  
//타입 정의
type data int
//메서드 정의
//비구조화된 타입 리시버 
func (d1 data) multiply(d2 data) data { 
    return d1 * d2 
} 
  
/* 
//이 코드를 실행하려고 시도하면,
//그런 다음 컴파일러는 오류를 발생시킵니다 
func(d1 int)multiply(d2 int)int{ 
return d1 * d2 
} 
*/
  
func main() { 
    value1 := data(23) 
    value2 := data(20) 
    res := value1.multiply(value2) 
    fmt.Println("최종 결과: ", res) 
}

출력:

최종 결과:  460

포인터 리시버를 가진 Go 메서드

Go 언어에서는 다음과 같이 사용할 수 있습니다:포인터리시버가 메서드에서 수행하는 변경이 호출자에 반영되도록 도와주는 포인터 리시버를 사용하는 경우, 이는 값 리시버에서는 불가능합니다.

문법:

func (p *Type) method_name(...Type) Type {
    // 코드
}
package main 
  
import "fmt"
  
// Author 구조체
type author struct { 
    name string 
    branch string 
    particles int
} 
  
//메서드, author 타입의 리시버 사용
func (a *author) show(abranch string) { 
    (*a.branch = abranch 
} 
  
// Main 함수 
func main() { 
  
    //author 구조체 초기화
    res := author{ 
        name: "Sona", 
        branch: "CSE", 
    } 
  
    fmt.Println("저자 이름: ", res.name) 
    fmt.Println("부서 이름(이전): ", res.branch) 
  
    //포인터 생성
    p := &res 
  
    //show 메서드 호출
    p.show("ECE") 
    fmt.Println("저자 이름: ", res.name) 
    fmt.Println("부서 이름(이후): ", res.branch) 
}

출력:

저자 이름: Sona
부서 이름(이전): CSE
저자 이름: Sona
부서 이름(이후): ECE

메서드는 포인터와 값을 받을 수 있습니다.

众所周知,在Go中,当一个函数具有值参数时,它将仅接受参数的值,如果您尝试将指针传递给值函数,则它将不接受,反之亦然。但是Go 메서드는 값을 받을 수 있으며, 이는 메서드가 포인터 수신자 또는 값 수신자로 정의되었든지에 관계없습니다. 예를 들어:

package main 
  
import "fmt"
  
// Author 구조체
type author struct { 
    name string 
    branch string 
} 
  
//포인터 메서드
//author 타입의 수신자
func (a *author) show_1(abranch string) { 
    (*a.branch = abranch 
} 
  
//값 메서드
//저자 타입의 수신자 
func (a author) show_2()) { 
    a.name = "Gourav"
    fmt.Println("저자 이름(이전): ", a.name) 
} 
  
func main() { 
  
     //초기화 값
     //저자 구조체
    res := author{ 
        name: "Sona", 
        branch: "CSE", 
    } 
  
    fmt.Println("부서 이름(이전): ", res.branch) 
  
     //show_ 호출1메서드
     //(포인터 메서드) 값을 가진
    res.show_1("ECE") 
    fmt.Println("부서 이름(이후): ", res.branch) 
  
     //show_ 호출2메서드
     //포인터를 가진(값 메서드)
    (&res).show_2()) 
    fmt.Println("저자 이름(이후): ", res.name) 
}

출력:

부서 이름(이전): CSE
부서 이름(이후): ECE
저자 이름(이전): Gourav
저자 이름(이후): Sona

메서드와 함수의 차이

메서드함수

수신자를 포함합니다.

수신자를 포함하지 않습니다.

포인터와 값을 받을 수 있습니다.

포인터와 값을 동시에 받을 수 없습니다.

프로그램에서는 동일한 이름이지만 다른 타입의 메서드를 정의할 수 있습니다.

프로그램에서는 동일한 이름이지만 다른 타입의 함수를 정의할 수 없습니다.