[Go] 사용자 정의 타입
Updated:
개요
- 타입 정의
- 기본 자료형
- hour, minute와 같이 기본 자료형 타입이지만 구분이 필요한 경우 사용
- 구조체
- 여러 타입의 값으로 구성된 값
- 정의와 동시에 선언 가능
- 필드 값의 제로 값은 각 타입의 제로 값
- 구조체 리터럴로 초기화 가능
- 익명 필드(anonymous field)
- 이름 없이 타입만 지정된 필드
- 익명 구조체 필드
- 해당 구조체의 필드 이름만으로 접근 가능
- 기본 자료형
- 메소드 정의
- 리시버 매개변수(receiver parameter)를 통해 정의
func (t test2) xxx() {...}
- t는 리시버 매개변수 이름
- test2는 리시버 매개변수의 타입
- 매개변수 이름은 아무 이름이나 허용되나 보통 타입의 첫번째 문자의 소문자를 사용
- 복사복이 전달되며 값 변경이 필요한 경우 포인터(
(t *test2)
)로 정의
- 동일한 패키지의 타입에 대해서만 메소드 정의 가능
- 설정자 메소드(setter method)
- 필드 값을 설정하기 위한 메소드로
SetX()
형태로 정의
- 필드 값을 설정하기 위한 메소드로
- 접근자 메소드(getter method)
- 필드 값을 반환하는 메소드로
GetX
가 아닌X
형태로 정의
- 필드 값을 반환하는 메소드로
예제
- 코드
package main import "fmt" type hour int type minute int func (m minute) method() { println(m) } type test struct { i int s string } func (t test) copyMethod() { t.i = 7 } func (t *test) pointerMethod() { t.i = 7 } type test2 struct { ii int ss string t test test } func (t *test2) I() int { return t.i } func (t *test2) SetI(i int) { t.i = i } func main() { i1 := hour(1) println(i1) i2 := minute(1) i2.method() var s1 struct { i int s string } fmt.Printf("%#v\n", s1) println("------") s2 := test{i: 1, s: "a"} fmt.Println(s2) s2.copyMethod() println(s2.i) s2.pointerMethod() println(s2.i) println("------") s3 := test2{} s3.t.i = 1 s3.i = 1 s3.SetI(2) println(s3.I()) }
- 실행 결과
1 1 struct { i int; s string }{i:0, s:""} ------ {1 a} 1 7 ------ 2