다음 칼럼인 Golang Tutorial에서는 Go 언어 프로그래밍의 장점과 단점을 소개하겠습니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!
최근에는 Google이 2009년에 출시한 오픈소스 프로그래밍 언어인 Go를 사용하여 API를 작성했습니다. 우리는 Go를 개발에 활용하는 과정에서 많은 경험과 통찰력을 얻었고 이를 독자들과 공유하고 싶어서 이 글을 쓰게 되었습니다.
프로젝트의 프로그래밍 언어를 선택할 때 프로젝트를 빌드하는 데 사용할 프로그래밍 언어를 고려하기 전에 항상 프로젝트가 빌드될 내용을 이해하는 것이 좋습니다. 제품이 어떻게 구축되어야 하는지에 대한 결정적인 요소가 되도록 하십시오.
다음은 Go로 개발할 때 발견한 몇 가지 장단점입니다. 이는 Go가 다음 프로젝트를 구축하는 데 사용할 적합한 언어인지 이해하는 데 도움이 될 수 있습니다.
Go 언어의 사용이 최근 몇 년간 폭발적으로 증가했습니다. 모든 스타트업이 백엔드 시스템에 이를 사용하는 것 같습니다. 개발자들은 이 앱이 인기를 끄는 데에는 여러 가지 이유가 있다고 믿습니다.
Go 언어는 매우 빠릅니다.
Go 언어는 매우 빠른 프로그래밍 언어입니다. Go 언어는 기계어 코드로 컴파일되기 때문에 자연스럽게 해석되거나 가상 런타임이 있는 프로그래밍 언어보다 더 나은 성능을 발휘합니다. Go 프로그램은 또한 매우 빠르게 컴파일되며 결과 바이너리도 매우 작습니다. 우리 API는 단 몇 초 만에 컴파일되며 결과 실행 파일 크기는 11.5MB에 불과합니다.
Easy to Master
다른 언어에 비해 Go 언어의 구문은 매우 간단하고 익히기 쉽습니다. Go의 구문 대부분을 머릿속에 간직할 수 있습니다. 즉, 내용을 찾는 데 많은 시간을 소비할 필요가 없습니다. Go 언어도 매우 깨끗하고 읽기 쉽습니다. Go를 사용하지 않는 프로그래머, 특히 C 스타일 구문에 익숙한 프로그래머는 Go 코드를 읽고 무슨 일이 일어나고 있는지 이해할 수 있습니다.
정적 유형 정의 언어
Go 언어는 강력한 정적 유형 정의 언어입니다. int, byte, string과 같은 기본 유형이 있습니다. 구조적 유형도 있습니다. 강력한 유형의 언어와 마찬가지로 유형 시스템을 사용하면 컴파일러가 클래스 전체에서 오류를 포착하는 데 도움을 줄 수 있습니다. Go 언어에는 목록과 지도 유형도 내장되어 있으며 사용하기도 쉽습니다.
인터페이스 유형
Go 언어에는 인터페이스 유형이 있으며, 어떤 구조라도 인터페이스 메소드를 구현하기만 하면 인터페이스를 만족시킬 수 있습니다. 이를 통해 코드에서 종속성을 분리할 수 있습니다. 그런 다음 테스트에서 종속성을 모의할 수 있습니다. 인터페이스를 사용하면 더욱 모듈화되고 테스트 가능한 코드를 작성할 수 있습니다. Go 언어에는 또한 개발자가 보다 실용적인 방식으로 코드를 작성할 수 있게 해주는 최고 수준의 기능이 있습니다.
표준 라이브러리
Go 언어에는 꽤 좋은 표준 라이브러리가 있습니다. 기본 유형 작업에 편리한 내장 기능을 제공합니다. 쉽게 웹 서버를 구축하고, I/O를 처리하고, 암호화 기술을 사용하고, 원시 바이트를 조작할 수 있는 패키지가 있습니다. 표준 라이브러리에서 제공하는 JSON 직렬화 및 역직렬화는 매우 간단합니다. "태그"를 사용하면 구조체 필드 옆에 JSON 필드 이름을 지정할 수 있습니다.
테스트 지원
테스트 지원은 표준 라이브러리에 내장되어 있으며 추가 종속성이 필요하지 않습니다. thing.go라는 파일이 있으면 thing_test.go라는 다른 파일에 테스트를 작성하고 "go test"를 실행하세요. Go는 이러한 테스트를 신속하게 실행합니다.
정적 분석 도구
Go 언어에는 다양하고 강력한 정적 분석 도구가 있습니다. 특히 Go에서 제안한 스타일에 따라 코드 형식을 지정하는 gofmt라는 도구 중 하나가 있습니다. 이를 통해 프로젝트에 대한 많은 의견이 표준화되고 팀 관리자가 코드로 수행되는 작업에 집중할 수 있습니다. 각 빌드에서 gofmt, golint 및 vet를 실행하고 경고가 발견되면 빌드가 실패합니다.
Garbage Collection
Go 언어를 설계할 때 메모리 관리는 의도적으로 C 및 C++보다 쉽도록 설계되었습니다. 동적으로 할당된 개체는 가비지 수집됩니다. Go 언어는 포인터 산술을 허용하지 않기 때문에 포인터 사용을 더 안전하게 만듭니다. 값 유형을 사용하는 옵션도 제공됩니다.
더 쉬운 동시성 모델
동시 프로그래밍이 결코 쉬운 적은 없지만 Go에서는 다른 언어보다 동시 프로그래밍이 더 쉽습니다. 이는 "고루틴"이라는 경량 스레드를 생성하고 "채널"을 통해 통신하는 것만큼 간단하며, 더 복잡한 모델도 가능합니다.
앞서 논의했듯이 Go는 정말 훌륭한 언어입니다. 구문이 깨끗하고 실행 속도가 빠릅니다. 또한 많은 장점이 있습니다. 그러나 프로그래밍 언어가 구문에 관한 전부는 아닙니다. 우리가 직면한 몇 가지 문제는 다음과 같습니다.
No Generics
우선 이 문제는 방 안의 코끼리와 같아서 명백하지만 무시되는 사실입니다. Go 언어에는 제네릭이 없습니다. Java와 같은 언어를 사용하는 개발자에게 Go로 전환하는 것은 극복해야 할 큰 장애물입니다. 이는 코드 재사용 수준이 감소함을 의미합니다. Go 언어에는 일류 함수가 있지만 "map", "reduce" 및 "filter"와 같은 함수를 작성하고 이러한 함수가 한 유형의 컬렉션에서 작동하도록 설계하는 경우 다른 유형의 컬렉션에서 이러한 함수를 재사용할 수 없습니다. . 이 문제를 해결하는 방법은 여러 가지가 있지만 결국에는 모두 더 많은 코드를 작성해야 하므로 생산성과 유지 관리성이 떨어집니다.
인터페이스는 암시적입니다
인터페이스를 갖는 것도 좋지만 구조체는 명시적이 아닌 암시적으로 인터페이스를 구현합니다. 이것이 Go 언어의 장점 중 하나라고 하는데, 인터페이스 구현 여부를 구조적으로 파악하기 어려웠습니다. 프로그램을 컴파일해 보아야만 실제로 알 수 있습니다. 프로그램이 작다면 이것은 확실히 문제가 되지 않습니다. 하지만 프로그램이 중대형이라면 문제가 커질 것이다.
빈약한 라이브러리 지원
Go 언어 라이브러리 지원이 부족합니다. 우리 API는 공식적으로 지원되는 Go SDK가 없는 Contentful과 통합됩니다. 이는 Contentful에서 데이터를 요청하고 구문 분석하기 위해 많은 코드를 작성하고 유지해야 함을 의미합니다. 또한 타사 Elasticsearch 라이브러리에도 의존해야 합니다. 공급업체가 제공하는 Go SDK는 Java, Ruby 또는 JavaScript 대응 제품만큼 인기가 없습니다.
커뮤니티 커뮤니케이션이 어렵습니다
Go 커뮤니티에서는 제안을 수락하지 않을 수 있습니다. golint의 GitHub 저장소(https://github.com/golang/lint/issues/65)에서 이 문제를 고려하세요. 사용자는 경고가 발견되면 golint가 빌드를 실패할 수 있도록 요청했습니다(이것이 프로젝트 문제에서 우리가 하는 일입니다). ). 유지관리자들은 그 아이디어를 즉각 일축했습니다. 그러나 너무 많은 사람들이 이 문제에 대해 언급했기 때문에 관리자는 요청한 기능을 1년 후에 추가하게 되었습니다.
Go 커뮤니티도 웹 프레임워크를 좋아하지 않는 것 같습니다. Go의 HTTP 라이브러리는 많은 영역을 다루지만 경로 매개변수, 입력 확인 및 유효성 검사 또는 웹 애플리케이션에서 흔히 발생하는 교차 문제를 지원하지 않습니다. Ruby 개발자에게는 Rails가 있고, Java 개발자에게는 Spring MVC가 있으며, Python 개발자에게는 Django가 있습니다. 그러나 많은 Go 개발자는 프레임워크 사용을 기피합니다. 그러나 현실은 프레임워크가 없는 것이 아니라 오히려 많다. 그러나 프로젝트에 프레임워크를 사용하기 시작하면 포기를 피하기가 거의 불가능합니다.
분할 종속성 관리
오랫동안 Go 언어에는 안정적이고 공식적인 패키지 관리자가 없었습니다. Go 프로젝트는 수년간의 커뮤니티 구걸 끝에 최근에야 goep을 출시했습니다. 이전에는 이러한 격차를 메워주는 많은 도구가 있었습니다. 우리는 프로젝트에서 매우 강력한 govendor를 사용하지만 이는 커뮤니티가 단편화되어 있으며 Go 언어를 처음 접하는 개발자에게 매우 혼란스러울 수 있음을 의미합니다. 또한 거의 모든 패키지 관리자는 Git 리포지토리를 기반으로 하며 Git 리포지토리의 기록은 언제든지 변경될 수 있습니다. 프로젝트가 의존하는 라이브러리를 제거하거나 변경하지 않는 Maven Central과 비교해 보세요.
Go 언어 사용 여부 결정
때로는 기계의 상황을 고려해야 할 때가 있습니다. 바이트를 보내고 받을 때. 수천 개의 동시 프로세스를 관리하는 경우. 운영 체제, 컨테이너 시스템 또는 블록체인 노드를 작성할 수도 있습니다. 이러한 경우에는 제네릭에 신경 쓰지 않을 가능성이 높습니다. 왜냐하면 칩에서 나노초 단위의 성능을 짜내느라 바쁘기 때문입니다.
하지만 인간을 고려해야 할 때가 많습니다. 처리해야 하는 비즈니스 도메인 데이터: 고객, 직원, 제품, 주문. 이러한 도메인 엔터티에서 작동하는 비즈니스 논리를 작성해야 하며 수년 동안 이 비즈니스 논리를 유지해야 합니다. 그리고 변화하는 요구 사항을 처리해야 하며 가능한 한 빨리 처리해야 합니다. 이러한 경우 개발자 경험이 중요합니다.
Go는 인간의 시간보다 기계의 시간을 더 중요하게 생각하는 프로그래밍 언어입니다. 때로는 기계 또는 프로그램 성능이 해당 분야에서 가장 중요할 수 있습니다. 이러한 경우 Go는 C 또는 C++의 좋은 대안이 될 수 있습니다. 그러나 일반적인 n 계층 애플리케이션을 작성할 때 데이터베이스에서 성능 병목 현상이 자주 발생하며, 더 중요한 것은 데이터 모델링 방법에서 발생합니다.
Go 언어 사용 여부를 결정할 때 다음 경험 법칙을 고려하세요.
바이트를 다루는 경우 Go 언어가 좋은 선택일 수 있습니다.
데이터를 다루는 경우 Go 언어는 좋은 선택이 아닐 수 있습니다.
이 상황은 언젠가 바뀔 수도 있습니다. Go 언어와 커뮤니티는 아직 매우 어립니다. 그들은 우리를 놀라게 하고 제네릭을 추가하거나 인기 있는 웹 프레임워크가 대신할 수도 있습니다. 하지만 지금은 보편적인 지원, 성숙한 종속성 관리 및 비즈니스 도메인 모델링에 중점을 둔 성숙한 프로그래밍 언어를 고수할 것입니다.
더 많은 Go 기술 기사를 보려면 go 언어 튜토리얼 칼럼을 방문하세요!
위 내용은 Go 언어 프로그래밍의 장점과 단점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!