괴발개발 성장기

Study/Go 언어

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

지니유 2022. 2. 18. 11:46
반응형

# 구조체

구조체: 다른 타입 여러 필드를 하나로 묶어주는 것입니다.

# 기본 구조체

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 타입으로 변수를 선언했습니다.

# 초기화 설정 방법

예시

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}

2) 여러줄로 표현하기

  • 여러줄로 표현할 때에는 마지막 , (쉼표)를 꼭 찍어줘야한다. 쉼표 뒤에 있는 } 중괄호 닫힘은 다음 줄에 적어야지 적용이 됩니다.

예시

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}

 

2) 여러줄로 표현하기

예시

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 오류 문구가 뜨면서 컴파일이 되지 않습니다.
반응형

'Study > Go 언어' 카테고리의 다른 글

[golang] 환경변수 설정하는 방법  (0) 2022.02.20
[golang] 타입(type) 확인 하는 방법  (0) 2022.02.19
[golang] 배열 공부하기  (0) 2022.02.14
[golang] for range 공부하기  (0) 2022.02.13
[golang] for문 공부하기  (0) 2022.02.12