Go 언어는 객체 지향 프로그래밍을 지원하는데, 메소드는 객체의 동작을 정의하는 함수입니다. 일반적으로 메소드는 타입에 연결되어 사용됩니다. 하지만 Go 언어에는 메소드 리터럴이라는 기능이 제공되어, 메소드를 변수에 할당하거나 함수의 인자로 전달할 수 있습니다.
메소드 리터럴은 익명 함수와 유사한 형태를 가지며, 타입과 함수의 본문을 포함합니다. 메소드 리터럴은 func
키워드를 사용하여 정의되며, 타입과 메소드명 사이에 ()
를 사용해 인자를 전달할 수 있습니다.
type Person struct {
Name string
Age int
}
func (p Person) GetName() string {
return p.Name
}
func main() {
p := Person{
Name: "John",
Age: 30,
}
// 메소드 리터럴을 변수에 할당
getName := p.GetName
name := getName()
fmt.Println(name) // "John"
}
위의 예시에서는 Person
이라는 타입에 GetName()
이라는 메소드를 정의했습니다. main()
함수에서는 Person
객체를 생성하고, 해당 객체의 GetName()
메소드를 메소드 리터럴로 변수에 할당한 후 호출했습니다.
메소드 리터럴을 사용하면 기존의 메소드를 다른 함수로 전달할 수 있습니다. 예를 들어, 슬라이스에 대해서 메소드를 정의하고, 해당 메소드를 sort
패키지의 Sort()
함수의 인자로 전달하여 정렬할 수 있습니다.
type Numbers []int
func (n Numbers) Len() int {
return len(n)
}
func (n Numbers) Less(i, j int) bool {
return n[i] < n[j]
}
func (n Numbers) Swap(i, j int) {
n[i], n[j] = n[j], n[i]
}
func main() {
nums := Numbers{5, 2, 9, 1, 3}
sort.Sort(nums)
fmt.Println(nums) // [1 2 3 5 9]
}
위의 예시에서는 Numbers
라는 타입에 Len()
, Less()
, Swap()
메소드를 정의했습니다. 이 메소드들은 sort.Interface
인터페이스의 요구사항을 충족시킵니다. 그래서 Numbers
타입의 슬라이스를 sort.Sort()
함수에 전달하여 정렬할 수 있습니다.
메소드 리터럴은 Go 언어의 강력한 기능 중 하나로, 객체 지향적인 프로그래밍에서 유연한 코드 구성을 가능하게 해줍니다. 이를 통해 코드의 재사용성과 가독성을 높일 수 있으며, 유지 보수에도 도움이 됩니다.
더 자세한 내용은 Go 언어 공식 문서를 참조하시기 바랍니다.