English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 언어에서는 다음과 같이 사용할 수 있습니다:포인터리시버가 메서드에서 수행하는 변경이 호출자에 반영되도록 도와주는 포인터 리시버를 사용하는 경우, 이는 값 리시버에서는 불가능합니다.
문법:
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
메서드 | 함수 |
---|---|
수신자를 포함합니다. | 수신자를 포함하지 않습니다. |
포인터와 값을 받을 수 있습니다. | 포인터와 값을 동시에 받을 수 없습니다. |
프로그램에서는 동일한 이름이지만 다른 타입의 메서드를 정의할 수 있습니다. | 프로그램에서는 동일한 이름이지만 다른 타입의 함수를 정의할 수 없습니다. |