Go에서 메서드는 특정 타입에 대한 메서드임을 나타내는 receiver (리시버)가 있는 함수입니다:
type User struct { Name string } func (u *User) SayHello() { fmt.Println("안녕하세요,", u.Name) }
(u *User))는 함수의 첫 번째 인수처럼 작동하지만, 구문과 호출이 다릅니다.중요! 메서드는 여러분의 패키지에서 정의된 타입에만 선언할 수 있습니다 (다른 패키지에서 정의된 타입, 포함 내장 타입에는 메서드가 없음). 별칭에 대한 동작은 특별합니다:
type MyInt int)에 대해서는 메서드를 추가할 수 있습니다.type MyInt = int)에 대해서는 메서드를 추가할 수 없습니다. 왜냐하면 이것은 단순히 별칭일 뿐입니다.예:
type MyInt int func (m MyInt) Double() int { return int(m) * 2 } // 타입 별칭 type MyIntAlias = int // func (m MyIntAlias) Double() int { ... } // 컴파일 오류
[]int 타입 슬라이스에 대해 메서드를 선언할 수 있습니까, 아니면 타입 별칭에 대해 메서드를 선언할 수 있습니까?
답변: 내장 타입 슬라이스([]int)에 대해서는 메서드를 선언할 수 없습니다. 슬라이스 기반의 새로운 사용자 정의 타입에 대해서는 가능합니다:
type MySlice []int func (s MySlice) Sum() int { ... } // 허용됨
타입 별칭에 대해서는 불가능합니다:
type SuperSlice = []int // func (s SuperSlice) Sum() int { ... } // 오류
이야기
이야기
이야기
외부 패키지의 타입(예: time.Time)에 메서드를 추가하려고 했으나 날짜와의 작업을 표준화하기 위해 이것이 Go에서 불가능하다는 것을 알게 되어 조합(composition) 및 유틸리티 함수를 사용해야 했습니다.