클래스가 없고 C 언어에는 구조가 있습니다. 그렇다면 Go 의 구조에는 어떤 특별한 점이 있을까요?

Go 언어에는' 클래스' 라는 개념도 없고' 클래스' 의 상속 등 객체 지향 개념도 지원하지 않습니다. Go 언어는 구조적 내장 인터페이스를 통해 객체 지향 인터페이스보다 높은 확장성과 유연성을 제공합니다.

사용자 정의 유형

Go 언어에는 문자열, 정수, 부동 소수점, 부울 등과 같은 몇 가지 기본 데이터 유형이 있습니다. Go 언어에서는 type 키워드를 사용하여 사용자 정의 유형을 정의할 수 있습니다.

사용자 정의 유형은 완전히 새로운 유형을 정의합니다. 내장된 기본 유형을 기반으로 하거나 struct 를 통해 정의할 수 있습니다. 예를 들면 다음과 같습니다.

MyInt 는 Type 키워드로 정의된 새로운 유형이며 Int 의 특징을 가지고 있습니다.

유형 별칭

유형 앨리어스는 버전 Go 1.9 에 추가된 새로운 기능입니다.

TypeAlias 규정: TypeAlias 는 Type 의 별칭일 뿐, 본질적으로 TypeAlias 와 Type 은 같은 유형이다. 어릴 때 별명과 유명을 가진 아이처럼, 학교 후에 학명으로, 영어 선생님은 그에게 영어 이름을 지어 주지만, 이 이름들은 모두 그를 가리킨다.

유형 유형 별칭 = 유형

앞에서 본 Rune 과 byte 는 모두 유형 별칭이며 다음과 같이 정의됩니다.

유형 정의와 유형 별칭의 차이점

표면적으로 유형 별칭과 유형 정의 사이에는 등호의 차이만 있습니다. 우리는 다음 코드를 통해 그것들의 차이점을 이해할 수 있다.

결과는 유형 a 가 주요 유형임을 보여줍니다. NewInt-마스터 패키지 아래에 정의된 NewInt 의 유형을 의미합니다. B 의 유형은 int 입니다. MyInt 유형은 코드에만 존재하며 컴파일이 완료되면 MyInt 유형이 없습니다.

Go 언어의 기본 데이터 유형은 일부 사물의 기본 속성을 표현할 수 있지만, 한 가지 속성의 전부 또는 일부를 표현하고자 할 때 단일 기본 데이터 유형을 사용하는 것은 분명히 수요를 충족시키지 못합니다. Go 언어는 여러 기본 데이터 유형을 캡슐화할 수 있는 사용자 정의 데이터 유형을 제공합니다. 이 데이터 유형을 구조라고 하며 영어 이름은 struct 입니다. 즉, 우리는 struct 를 통해 우리 자신의 유형을 정의할 수 있다.

Go 언어는 struct 를 통해 객체 지향 언어를 구현합니다.

구조의 정의

Type 및 struct 키워드를 사용하여 구조를 정의합니다. 구체적인 코드 형식은 다음과 같습니다.

여기에는 다음이 포함됩니다.

예를 들어, 다음 코드를 사용하여 인력 구조를 정의합니다.

같은 유형의 필드도 한 줄에 쓸 수 있습니다.

이렇게 하면 이름, 시, 연령이라는 세 개의 필드가 있는 사용자 정의 개인 유형이 있습니다. 각각 이름, 시, 연령을 나타냅니다. 이렇게 하면 이 person 구조를 사용하여 프로그램에 있는 사람들의 정보를 쉽게 표현하고 저장할 수 있습니다.

언어에 내장된 기본 데이터 유형은 값을 설명하는 데 사용되고 구조는 값 세트를 설명하는 데 사용됩니다. 예를 들어, 이름, 나이, 거주 도시가 있는 사람은 기본적으로 합산 데이터 유형입니다.

구조 인스턴스화

구조가 인스턴스화된 경우에만 메모리가 실제로 할당됩니다. 즉, 구조의 필드를 사용하려면 먼저 인스턴스화해야 합니다.

기본 인스턴스화

예를 들면 다음과 같습니다.

구조의 필드 (멤버 변수) 에 액세스하여 , 예: p 1.name, p 1.age 등.

익명 구조

익명 구조는 일부 임시 데이터 구조와 같은 시나리오를 정의하는 데도 사용할 수 있습니다.

포인터 유형 구조 만들기

또한 new 키워드를 사용하여 구조를 인스턴스화하고 해당 구조의 주소를 얻을 수 있습니다. 형식은 다음과 같습니다.

인쇄 결과에서 p2 가 구조 포인터임을 알 수 있습니다.

Go 언어 지원이 직접 사용된다는 점에 유의해야 한다. 구조의 멤버에 액세스합니다.

인스턴스화된 구조의 주소입니다

구조체의 주소 작업은 구조체 유형의 새로운 인스턴스화 작업과 같습니다.

P3.name = "7 미터" 는 실제로 (* P3) 맨 아래에 있습니다. Name = "7 미터", 이것은 Go 언어가 우리가 실현할 수 있도록 도와주는 문법설탕이다.

구조 초기화

초기화되지 않은 구조의 경우 해당 멤버 변수는 해당 유형에 해당하는 0 값입니다.

키 값 쌍으로 초기화

키-값 쌍을 사용하여 구조를 초기화할 때 키는 구조의 필드에 해당하고 값은 필드의 초기 값에 해당합니다.

구조 포인터의 키 값 쌍을 초기화할 수도 있습니다. 예를 들면 다음과 같습니다.

일부 필드에 초기 값이 없을 경우 이러한 필드에 쓰지 못할 수 있습니다. 이 시점에서 초기 값이 지정되지 않은 필드의 값은 필드 유형의 0 값입니다.

값 목록으로 초기화

구조를 초기화할 때 구조를 축약할 수 있습니다. 즉, 초기화 시 키를 쓰지 않고 값을 직접 쓸 수 있습니다.

이 형식을 사용하여 초기화하는 경우 다음 사항에 유의하십시오.

구조 메모리 레이아웃

구조는 하나의 연속 메모리 블록을 차지합니다.

출력:

Go 의 메모리 정렬에 대한 고급 지식 포인트 추천 읽기: Go 의 적절한 메모리 정렬

면접 질문

다음 코드의 실행 결과는 무엇입니까?

구성기

Go 언어의 구조에는 생성자가 없으며, 우리는 스스로 실현할 수 있다. 예를 들어, 다음 코드는 person 의 생성자를 구현합니다. Struct 는 값 유형이므로 구조가 복잡한 경우 값 복제의 성능 오버헤드가 크기 때문에 생성자는 해당 구조의 포인터 유형을 반환합니다.

생성자를 호출합니다

방법 및 수신기

Go 언어의 방법은 특정 유형의 변수에 작용하는 함수입니다. 이런 특수한 유형의 변수를 수신기라고 합니다. 수신기의 개념은 다른 언어의 this 또는 self 와 유사합니다.

이 방법의 정의 형식은 다음과 같습니다.

그 중에서도,

예를 들면 다음과 같습니다.

메서드와 함수의 차이점은 함수가 어떤 유형에도 속하지 않고 메서드가 특정 유형에 속한다는 것입니다.

포인터 유형의 수신자

포인터 유형 수신기는 구조의 포인터로 구성됩니다. 포인터의 특성으로 인해 메서드를 호출할 때 수신자 포인터의 멤버 변수가 수정되고 메서드가 완료될 때까지 수정 사항이 적용되지 않습니다. 이 방법은 객체 지향 언어의 this or self 와 매우 유사합니다. 예를 들어, Person 에 SetAge 메서드를 추가하여 인스턴스 변수의 사용 기간을 수정합니다.

이 메서드 호출:

값 유형의 수신자

한 가지 방법이 값 유형 수신자에게 작용하는 경우 Go 언어는 코드가 실행될 때 수신자의 값을 복사합니다. Receiver 값 유형의 메서드에서 receiver 의 멤버 값을 가져올 수 있지만 수정 작업은 복제본에만 적용되며 receiver 변수 자체는 수정할 수 없습니다.

포인터 수신기는 언제 사용해야 합니까?

모든 유형의 추가 방법

Go 언어에서 수신자의 유형은 구조뿐만 아니라 모든 유형에 방법이 있을 수 있습니다. 예를 들어 type 키워드를 사용하여 내장 int 유형을 기반으로 새 사용자 정의 유형을 정의한 다음 사용자 정의 유형에 메서드를 추가할 수 있습니다.

주: 로컬이 아닌 유형은 메소드를 정의할 수 없습니다. 즉, 다른 패키지 유형에 대해서는 메소드를 정의할 수 없습니다.

구조의 익명 필드

기본적으로 익명 필드는 유형명을 필드명으로 사용하며, 구조에서는 필드명이 고유해야 하므로 한 구조에 같은 유형의 익명 필드가 하나만 있을 수 있습니다.

중첩 구조

구조는 다른 구조나 구조에 대한 포인터와 중첩될 수 있습니다.

중첩 익명 구조

구조의 멤버에 액세스하면 먼저 구조에서 해당 필드를 검색하고, 찾을 수 없는 경우 익명 구조에서 필드를 검색합니다.

중첩된 구조의 필드 이름이 충돌합니다.

중첩된 구조에 동일한 필드 이름이 있을 수 있습니다. 이 경우 모호성을 피하기 위해 특정 포함된 구조의 필드를 지정해야 합니다.

구조의 "상속"

Go 언어에서 구조를 사용하면 다른 프로그래밍 언어에서도 객체 지향 상속을 수행할 수 있습니다.

구조 필드 가시성

구조의 대문자 필드는 공개 액세스를 나타내고 소문자 필드는 비공개 액세스를 나타냅니다 (현재 구조를 정의하는 패키지에서만 액세스 가능).

구조 및 JSON 직렬화

JSON(JavaScript object expression) 은 경량 데이터 교환 형식입니다. 사람들이 읽고 쓰는 것을 용이하게 하다. 동시에 기계 분석 및 생성이 용이합니다. JSON 키 값 쌍은 JS 객체를 저장하는 방법입니다. 키/값 쌍 조합의 키 이름은 앞에 쓰여지고, 큰 따옴표 ""로 묶여 콜론으로 구분됩니다. ""구분, 그 뒤에 값이 옵니다. 영어로 여러 키 값을 구분합니다.

구조 태그

태그는 구조의 메타 정보이며 런타임에 반사 메커니즘에서 읽을 수 있습니다. 태그는 구조 필드 뒤에 정의되며 한 쌍의 역따옴표로 묶여 있습니다. 구체적인 형식은 다음과 같습니다.

`키1:"값1"키 2: "값 2" `

구조 태그는 하나 이상의 키-값 쌍으로 구성됩니다. 키와 값은 콜론으로 구분하고 값은 큰따옴표로 묶습니다. 키 값 쌍은 공백으로 구분됩니다. 참고: 구조에 대한 태그를 작성할 때 키 값 쌍의 규칙을 엄격히 준수해야 합니다. 구조 태그의 구문 분석 코드의 내결함성이 좋지 않습니다. 형식이 잘못되면 컴파일 및 런타임 시 오류 메시지가 표시되지 않으며 반사로 값을 제대로 얻을 수 없습니다. 예를 들어 키와 값 사이에 공백을 추가하지 마십시오.

예를 들어 Student 구조의 각 필드에 대해 JSON 직렬화에 사용되는 태그를 정의했습니다.