>  기사  >  백엔드 개발  >  Go 언어의 가장 중요한 기능은 무엇입니까?

Go 언어의 가장 중요한 기능은 무엇입니까?

青灯夜游
青灯夜游원래의
2022-12-16 19:04:115538검색

go 언어의 가장 중요한 기능은 다음과 같습니다. 1. 동시 프로그래밍; go 구문의 동시 프로그래밍은 매우 쉽고, 콜백을 처리할 필요가 없으며, 스레드 전환에 주의를 기울일 필요가 없으며, 단 하나의 키워드만 있으면 됩니다. 자연스러운. 2. 자동 가비지 수집: 프로그래머는 더 이상 메모리 재활용을 고려할 필요가 없지만 언어 기능은 메모리를 회수하기 위한 가비지 수집기를 제공합니다. 3. 내장 유형이 더욱 풍부해졌습니다. 4. 함수의 다중 반환 값. 5. 오류 처리. 6. 익명 기능 및 클로저. 7. 유형 및 인터페이스. 8. 리플렉션을 사용하면 개발자가 유형 자체를 최고 수준의 값 유형으로 처리할 수 있습니다. 9. 언어 상호작용.

Go 언어의 가장 중요한 기능은 무엇입니까?

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

Go 언어의 가장 중요한 기능은 다음과 같습니다:

  • 동시 프로그래밍

  • 자동 가비지 수집

  • 다양한 내장 유형

  • 다중 반환 값 기능

  • 익명 함수 및 클로저

  • 유형 및 인터페이스

  • reflection

  • 언어 상호 작용

을 처리할 때 발생하는 오류 동시 프로그래밍

오늘은 동시 프로그래밍 프로그램이 되었습니다. 직원들의 기본 스킬과 관련된 많은 토론 주제는 다양한 기술 커뮤니티에서 볼 수 있습니다. 이 경우 Go 언어는 매우 대담하고 독특하며 기본적으로 모든 것을 동시에 수행하여 런타임 중에 main.main 항목 기능을 포함하여 모든 것을 실행합니다.

고루틴은 Go의 가장 중요한 기능이라고 할 수 있습니다. 동시 단위를 처리하기 위해 코루틴과 유사한 접근 방식을 사용하지만 런타임 수준에서 더 심층적인 최적화도 수행합니다. 이는 구문상 동시 프로그래밍을 매우 쉽게 만듭니다. 콜백을 처리할 필요도 없고 스레드 전환에 주의를 기울일 필요도 없으며 단 하나의 키워드만 있으면 간단하고 자연스럽습니다.

Go 언어는 동시 프로그래밍 측면에서 대부분의 언어보다 훨씬 간단합니다. 이는 Go 언어의 가장 큰 특징 중 하나이며 향후 높은 동시성 및 고성능 시나리오에 진입하기 위한 중요한 협상 카드입니다.

Go 언어의 가장 중요한 기능은 무엇입니까?

기존의 다중 프로세스나 다중 스레드와는 달리 golang의 동시 실행 단위는 고루틴이라는 코루틴입니다.

잠금은 GC와 결합된 공유 데이터 시나리오에서 사용되기 때문에 동시성 성능은 때때로 비동기식 다중화 IO 모델만큼 좋지 않습니다. 따라서 대부분의 언어와 비교할 때 golang의 동시 프로그래밍 단순성은 동시성 성능보다 더 큰 판매 포인트입니다.

오늘날의 멀티 코어 시대에 동시 프로그래밍의 중요성은 자명합니다. 물론 많은 언어가 멀티스레드, 멀티프로세스 프로그래밍을 지원하지만, 안타깝게도 이를 구현하고 제어하는 ​​것은 그리 쉽고 즐겁지 않습니다. Golang과의 차이점은 언어 수준에서 코루틴(고루틴) 동시성을 지원한다는 것입니다(코루틴은 마이크로 스레드라고도 하며 스레드보다 가볍고 저렴하며 성능이 뛰어납니다). 언어 수준에서는 작동이 매우 간단합니다. 키워드 (go) 코루틴을 시작하는 데 사용되며, 동일한 시스템에서 수천 개의 코루틴을 시작할 수 있습니다. 코루틴은 종종 경량 스레드로 이해됩니다. 하나의 스레드는 여러 개의 코루틴을 포함할 수 있으며 공유 힙은 스택을 공유하지 않습니다. 코루틴 간의 스케줄링은 일반적으로 애플리케이션에 의해 명시적으로 구현되며 컨텍스트 전환은 커널 계층으로 내려갈 필요가 없으므로 훨씬 더 효율적입니다. 일반적으로 코루틴 간에는 동기식 통신이 없으며 golang에는 코루틴 간에 두 가지 유형의 통신이 있습니다. 1) 전역 변수 + 뮤텍스 잠금을 사용하여 데이터 공유를 달성하는 공유 메모리 유형 2) 고유한 Some을 사용하는 메시지 전달 유형 채널 메커니즘은 비동기 통신을 수행합니다.

JAVA의 멀티스레딩과 GO의 코루틴 구현을 비교하면 확실히 더 직접적이고 간단합니다. 문제를 간단하고 효율적으로 해결하는 것이 GO의 매력입니다. go 키워드는 아마도 GO 언어의 가장 중요한 상징일 것입니다.

높은 동시성은 Golang 언어의 가장 큰 특징

메모리 재활용(GC)

C부터 C++까지 프로그램 성능 측면에서 보면 이 두 언어를 사용하면 프로그래머가 스스로 메모리를 관리할 수 있고, 메모리 적용 및 출시 등을 포함합니다. 가비지 수집 메커니즘이 없기 때문에 C/C++는 매우 빠르게 실행되지만 프로그래머는 메모리 사용량을 신중하게 고려해야 합니다. 조금만 부주의해도 리소스를 낭비하는 "메모리 누수"나 프로그램 충돌을 일으키는 "와일드 포인터"가 발생할 수 있기 때문입니다. C++11에서는 나중에 스마트 포인터 개념을 사용했지만 여전히 프로그래머는 이를 매우 주의 깊게 사용해야 합니다. 이후 프로그램 개발 속도와 프로그램의 견고성을 높이기 위해 Java, C# 등 고급 언어에서는 GC 메커니즘을 도입했습니다. 즉, 프로그래머는 더 이상 메모리 재활용을 고려할 필요가 없지만 언어 기능은 메모리를 재활용하기 위한 가비지 수집기를 제공합니다. 그러나 그에 따른 결과는 프로그램 실행 효율성의 감소일 수 있습니다.

GC 프로세스는 다음과 같습니다. 먼저 세계를 중지하고, 모든 개체를 스캔하여 살아 있는지 확인하고, 재활용 가능한 개체를 비트맵 영역에 표시한 다음, 즉시 세계를 시작하고, 서비스를 재개하며, 동시에 특별한 goroutine을 시작합니다. 메모리를 사용 가능 목록으로 재활용하고 재사용할 준비가 되었으며 물리적으로 해제되지 않았습니다. 물리적 해제는 전용 스레드에 의해 주기적으로 수행됩니다.

GC 병목 현상은 수집할 객체가 많을수록 속도가 느려지는 것을 확인하기 위해 매번 모든 객체를 스캔해야 한다는 것입니다. 경험적 값은 100,000개의 개체를 검색하는 데 1ms가 걸린다는 것입니다. 따라서 더 적은 수의 개체가 포함된 솔루션을 사용해 보세요. 예를 들어 연결 목록과 맵, 슬라이스 및 배열을 동시에 저장하는 것을 고려합니다. Maps는 객체이고, Slice나 Array는 객체이므로 GC에는 Slice나 Array가 좋습니다.

GC 성능은 버전이 지속적으로 업데이트되므로 이를 주의 깊게 조사하지 않았습니다. 팀에 HotSpot 개발자가 있으므로 세대별 재활용, Safepoint 등 jvm gc의 설계 아이디어를 배워야 합니다. .

  • 메모리는 자동으로 재활용되므로 개발자는 더 이상 메모리를 관리할 필요가 없습니다

  • 개발자는 비즈니스 구현에 집중하여 정신적 부담을 줄입니다.

  • 메모리만 새로 할당하고 릴리스할 필요가 없습니다

더 풍부한 내장 유형

핵심은 내장에 있습니다. 맵 및 슬라이스와 같은 일반적인 데이터 유형은 내장에 내장되어 있으며 직접 추가할 필요가 없습니다.

다중 함수 반환 값

C, C++(다른 고급 언어 포함)에서는 다중 함수 반환 값이 지원되지 않습니다. 하지만 이 함수는 꼭 필요한 함수이기 때문에 C 언어에서는 일반적으로 반환값을 구조체로 정의하거나, 함수 매개변수 참조 형태로 반환합니다. Go 언어에서는 새로운 형태의 언어로서 강력한 언어로 자리매김하고 당연히 이러한 요구를 충족시키는 것을 포기할 수 없기 때문에 함수로부터 다중 반환값을 지원할 필요가 있다.

함수를 정의할 때 입력 매개변수 뒤에 (a, b, c)를 추가하면 a, b, c 3개의 반환 값이 있다는 뜻입니다. 이 기능은 Python과 같은 다양한 언어로 제공됩니다.

이 구문 설탕 기능은 실용적인 의미를 갖습니다. 예를 들어, 하나의 반환 값만 허용하는 대부분의 언어에서는 삼중항(errno, errmsg, data)만 사용할 수 있습니다. 수신자는 반환 값에 트리플이 포함되어 있는지 확인하는 코드도 작성해야 합니다. 여러 반환 값이 허용되는 경우 코드를 더 간결하게 만들기 위해 함수 정의 수준에서 직접 강제됩니다. 그리고 안전합니다.

언어 상호작용

언어 상호작용은 다른 언어로 컴파일된 라이브러리를 호출하는 등 이 언어가 다른 언어와 상호작용할 수 있는지 여부를 나타냅니다.

대부분의 C 모듈은 Go 언어(여기서는 Cgo라고 함)에서 직접 재사용됩니다. Cgo를 사용하면 개발자가 C 언어 코드를 혼합하고 작성할 수 있으며, Cgo 도구는 이러한 혼합 C 코드를 추출하고 C 함수 코드에 대한 호출 패키지를 생성할 수 있습니다. 개발자는 기본적으로 Go 언어와 C 언어의 경계가 어떻게 교차되는지 완전히 무시할 수 있습니다.

golang은 C 프로그램과 상호 작용할 수 있지만 C++과는 상호 작용할 수 없습니다. 두 가지 대안이 있습니다: 1) 먼저 C++를 동적 라이브러리로 컴파일한 다음 go에서 c 코드를 호출합니다. c 코드는 dlfcn 라이브러리를 통해 동적 라이브러리를 호출합니다(LD_LIBRARY_PATH 내보내기를 기억하세요). 이전에 해본 적이 없음)

예외 처리

golang은 try...catch와 같은 구조화된 예외 솔루션을 지원하지 않습니다. 왜냐하면 코드 양이 늘어나고 어떻게 해서든 남용될 것이라고 믿기 때문입니다. 작은 경우에는 예외가 발생합니다. golang이 주장하는 예외 처리 방법은 다음과 같습니다.

일반적인 예외: 피호출자는 오류 객체를 반환하고 호출자는 오류 객체를 결정합니다.

심각한 예외: 지연...복구...패닉 메커니즘을 사용하여 캡처 및 처리되는 중단성 패닉(예: 0으로 나누기)을 나타냅니다. 심각한 예외는 일반적으로 golang에 의해 내부적으로 자동으로 발생하며 사용자가 이를 적극적으로 발생시킬 것을 요구하지 않으므로 전통적인 try...catch가 모든 곳에 작성되는 상황을 피할 수 있습니다. 물론 사용자는 패닉('xxxx')을 사용하여 적극적으로 예외를 던질 수도 있지만 이렇게 하면 이 메커니즘이 구조화된 예외 메커니즘으로 변질됩니다.

Reflection

Go 언어는 변수의 값을 업데이트하고 확인하는 메커니즘, 변수의 호출 메서드 및 런타임 시 변수가 지원하는 내장 연산을 제공하지만 변수는 컴파일 타임에 알려지지 않습니다. 특정 유형, 이 메커니즘 반사라고 합니다. 또한 리플렉션을 사용하면 유형 자체를 일류 값 유형으로 처리할 수 있습니다.

리플렉션은 프로그램이 실행되는 동안 프로그램 자체에 액세스하고 수정하는 기능을 말합니다. 변수는 컴파일러에 의해 실행 가능한 부분에 기록되지 않습니다. 프로그램을 실행할 때 프로그램은 자신에 대한 정보를 얻을 수 없습니다.

리플렉션을 지원하는 언어는 프로그램 컴파일 중에 필드 이름, 유형 정보, 구조 정보 등 변수의 리플렉션 정보를 실행 파일에 통합하고 프로그램에 리플렉션 정보에 접근할 수 있는 인터페이스를 제공할 수 있습니다. , 프로그램이 실행될 수 있도록 유형 반영 정보에 대한 액세스 및 수정 기능을 제공합니다.

C/C++ 언어는 반사 기능을 지원하지 않으며 typeid를 통해 매우 약한 프로그램 런타임 유형 정보만 제공할 수 있습니다. Java 및 C#과 같은 언어는 모두 Lua 및 JavaScript와 같은 완전한 동적 언어를 지원합니다. 이를 통해 코드는 런타임에 프로그램 자체의 값과 유형 정보에 액세스할 수 있으므로 리플렉션 시스템이 필요하지 않습니다.

Go 언어 프로그램의 리플렉션 시스템은 실행 파일 공간이나 패키지의 모든 유형 정보를 얻을 수 없습니다. 소스 코드를 스캔하려면 표준 라이브러리의 해당 어휘, 구문 분석기 및 추상 구문 트리(AST)를 사용해야 합니다. 이 정보는 나중에.

【관련 추천: Go 비디오 튜토리얼, 프로그래밍 교육

위 내용은 Go 언어의 가장 중요한 기능은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.