Updated:

1 minute read

개요

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