개요
- 타입 정의
- 기본 자료형
- 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