🐾   [golang] 구조체(struct) 공부하기

구조체

-다른 타입 여러 필드를 하나로 묶어주는 것입니다.

기본 구조체

type 타입명 struct {
필드명 타입
필드명 타입
...
}

예제

type Donor struct {
DonationId      int64
NationalityType string
DonorType       string
Name            string
Mobile          string
RegistrationNo  string
Email           string
Check           bool
}

구조체를 선언하는 방법

var 변수명 구조체이름

예시

var donorStruct Donor
  • Donor 타입으로 변수를 선언했습니다.

배열 표현 방식

var 변수명 [요소개수]타입

예시

var arr2 [6]int

초기화 설정 방법

예시

func SetStruct() {
var donorStruct Donor
fmt.Println("초기값 설정 전 :", donorStruct)

donorStruct.DonationId = 123
donorStruct.Email = "1@test.com"
donorStruct.NationalityType = "NATIVE"
donorStruct.DonorType = "INDIVIDUAL"
donorStruct.Name = "홍길동"
donorStruct.Mobile = "0000000000"
donorStruct.Check = true

fmt.Println("초기값 설정 후 :", donorStruct)
fmt.Println("이름 필드 값 출력 :", donorStruct.Name)
}

결과

초기값 설정 전 : {0       false}
초기값 설정 후 : {123 NATIVE INDIVIDUAL 홍길동 0000000000  1@test.com true}
이름 필드 값 출력 : 홍길동
  • 초기값을 설정하지 않는 경우 int는 0, string은 “”, bool은 false으로 설정됩니다.

모든 필드를 초기화 하는 방법

  1. 한줄로 표현하기
  • 구조체에 순서대로 모든 필드에 값을 넣으면 됩니다.

예시

var donorStructV1 = Donor{1, "NATIVE", "INDIVIDUAL", "홍길동", "0000000000", "9901012000000", "1@test.com", true}
fmt.Println("V1 초기값 설정 후 :", donorStructV1)
// V1 초기값 설정 후 : {1 NATIVE INDIVIDUAL 홍길동 0000000000 9901012000000 1@test.com true}
  1. 여러줄로 표현하기
  • 여러줄로 표현할 때에는 마지막 , (쉼표)를 꼭 찍어줘야한다. 쉼표 뒤에 있는 } 중괄호 닫힘은 다음 줄에 적어야지 적용이 됩니다.

예시

var donorStructV2  = Donor{
1,
"NATIVE",
"INDIVIDUAL",
"홍길동",
"0000000000",
"9901012000000",
"1@test.com",
true,
}
fmt.Println("V2 초기값 설정 후 :", donorStructV2)
// V2 초기값 설정 후 : {1 NATIVE INDIVIDUAL 홍길동 0000000000 9901012000000 1@test.com true}

일부 필드만 초기화하는 방법

  1. 한줄로 표현하기

예시

var donorStructV3 = Donor{Name: "홍길동", Email: "1@test.com"}
fmt.Println("V3 초기값 설정 후 :", donorStructV3)

결과

V3 초기값 설정 후 : {0   홍길동   1@test.com false}
  1. 여러줄로 표현하기

예시

var donorStructV4 = Donor{
DonationId: 100,
Name: "홍길동",
Email: "1@test.com",
}
fmt.Println("V4 초기값 설정 후 :", donorStructV4)

결과

V4 초기값 설정 후 : {100   홍길동   1@test.com false}

구조체를 포함하는 구조체

  • 구조체 필드에 다른 구조체를 정의할 수 있습니다.
type 구조체명 struct {
필드명 다른구조체명
}

예시

type DonorReceipt struct {
Id     int64
Status string
Type   string
Note   string
Name   string
Donor  Donor
}
  • 위에 Donor라는 구조체를 DonorReceipt 구조체 안에 포함을 시켰습니다.

구조체안에 구조체를 설정하는 방법

예시

var donor = Donor{
1,
"NATIVE",
"INDIVIDUAL",
"홍길동",
"0000000000",
"9901012000000",
"1@test.com",
true,
}

var donorReceiptV1 = DonorReceipt{
Id:     1,
Status: "Applied",
Donor:  donor,
}
fmt.Println("donor 초기값 설정 후 :", donor)
fmt.Println("donorReceipt V1 초기값 설정 후 :", donorReceiptV1)

var donorReceiptV2 = DonorReceipt{
Id:     1,
Status: "Applied",
Donor: Donor{
DonorType: "INDIVIDUAL",
Name:      "김철수",
},
}
fmt.Println("donorReceipt V2 초기값 설정 후 :", donorReceiptV2)

결과

donor 초기값 설정 후 : {1 NATIVE INDIVIDUAL 홍길동 0000000000 9901012000000 1@test.com true}
donorReceipt V1 초기값 설정 후 : {1 Applied    {1 NATIVE INDIVIDUAL 홍길동 0000000000 9901012000000 1@test.com true}}
donorReceipt V2 초기값 설정 후 : {1 Applied    {0  INDIVIDUAL 김철수    false}}
  • donorReceiptV1는 변수 donor에 있는 전체 값을 Donor 필드에 넣었습니다.
  • donorReceiptV2는 Donor 필드에 일부 값만 넣었습니다.

중복된 필드명이 있는 경우

  • . (점)을 사용하여 한단계 더 접근 해서 값을 불러 옵니다.

예시

var donorReceipt = DonorReceipt{
Id:     1,
Status: "Applied",
Name: "김영희",
Donor: Donor{
DonorType: "INDIVIDUAL",
Name:      "김철수",
},
}
fmt.Println("donorReceipt 필드안에 있는 donor의 name 값 :", donorReceipt.Donor.Name) //김철수
fmt.Println("donorReceipt 안에 name 값 :", donorReceipt.Name) //김영희
  • 재귀적인 표현이 불가능하다

예시

type Donor struct {
DonationId      int64
DonorReceipt DonorReceipt
}

type DonorReceipt struct {
Id     int64
Donor  Donor
}
  • 위 처럼 코드를 짜면 Invalid recursive type ‘DonorReceipt’ DonorReceipt → Donor → DonorReceipt 오류 문구가 뜨면서 컴파일이 되지 않습니다.

​ ​ ​