Go(프로그래밍 언어)

Go (programming language)
가세요
Go Logo Blue.svg
패러다임멀티패러다임: 동시필수, 객체지향[1][2]
설계자로버트 그리세머
롭 파이크
켄 톰슨
개발자Go[3] 작성자
처음 등장한2009년 11월 10일, 12년 전(2009-11-10)
안정된 릴리스
1.19[4] / 2022년 8월 2일; 이틀 전 (2022년 8월 2일)
타이핑 분야유추, 정적, 취약, 구조,[5][6] 공칭
구현 언어Go, 어셈블리 언어(gc), C++(고프런트 엔드)
OSDragonFly BSD, FreeBSD, Linux, macOS, NetBSD, OpenBSD,[7] Plan 9,[8] Solaris, Windows
면허증.3조항[3] BSD + 특허[9] 부여
파일 이름 확장자.가세요
웹 사이트go.dev
주요 구현
gc, gofrontend
영향을 받다
C, Oberon-2, Limbo, Active Oberon, 통신 시퀀셜 프로세스, Pascal, Oberon, Smalltalk, Newsqueak, Modula-2, Alef, APL, BCPL, Modula, occam
영향받은
오딘, 크리스탈, 지그

Go는 Rob Griesemer, Rob Pike 및 Ken [11]Thompson이 구글에서[10] 설계한 정적 형식의 컴파일 프로그래밍 언어입니다.C와 구문적으로는 비슷하지만 메모리 안전성, 가비지 수집, 구조 유형 [5]및 CSP 스타일의 [12]동시성있습니다.그것은 종종 그것의 이전 도메인 이름 때문에 골랑이라고 불린다.golang.org본명은 [13]Go 입니다.

주요 실장은 다음 두 가지가 있습니다.

  • 구글의 자체 호스팅[14] "gc" 컴파일러 체인. 여러 운영 체제와 Web [15]Assembly를 대상으로 합니다.
  • gofrontend는 libgo 라이브러리를 사용하는 다른 컴파일러의 프런트 엔드입니다.GCC의 경우 조합은 gccgo,[16] LLVM의 경우 조합은 gollvm입니다.[17][a]

서드파티제의 소스소스 컴파일러인 GopherJS는 [19]프런트엔드개발을 위해 JavaScript로 이동 컴파일을 합니다.

역사

Go는 2007년 구글에서 멀티코어, 네트워크 머신 및 대규모 코드베이스 [20]시대에 프로그래밍 생산성을 향상시키기 위해 설계되었습니다.디자이너들은 구글에서 사용되고 있는 다른 언어에 대한 비판에 대처하고 싶었지만, 그들의 유용한 [21]특징은 유지하기를 원했다.

디자이너들은 주로 C++[23][24][25]대한 공통적인 혐오에 의해 동기부여를 받았다.

Go는 2009년 [26]11월에 공개 발표되었으며 버전 1.0은 2012년 [27][28]3월에 출시되었습니다.Go는 Google의 프로덕션[29] 및 다른 많은 조직 및 오픈 소스 프로젝트에서 널리 사용되고 있습니다.

바둑 프로그래밍 언어의 마스코트는 위와 같은 고퍼입니다.

2016년 11월, Go와 Go Mono 글꼴은 Charles BigelowChris Holmes에 의해 Go 프로젝트에서 사용하기 위해 특별히 출시되었습니다.고는 루시다 그란데를 닮은 휴머니스트 산세리프, 고 모노는 모나스페이스다.두 글꼴 모두 WGL4 문자 집합을 준수하며 x-높이의 큰 글씨체로 읽기 쉽게 설계되었습니다.Go와 Go Mono는 모두 DIN 1450 규격에 준거하고 있으며, 제로(소문자)가 잘려 있습니다.l꼬리, 대문자 포함I세리프와 [30][31]함께.

2018년 4월, 원래의 로고는 GO 우측에 트레일링 유선형 스타일링으로 대체되었습니다.(Gopher 마스코트는 그대로입니다.)[32]

범용

바둑의 초기 버전에서는 범용 프로그래밍을 지원하지 않아 상당한 [33]비난을 받았다.설계자들은 일반 프로그래밍에 개방감을 표현하고 임베디드 함수는 실제로는 유형 일반적이지만 특수한 경우로 취급된다는 점에 주목했습니다. Pike는 이를 언젠가 [34]변경될 수 있는 약점이라고 했습니다.구글 팀은 제네릭스를 사용한 실험적인 바둑 사투리용 컴파일러를 하나 이상 만들었지만 [35]공개하지는 않았다.

2018년 8월 바둑 주요 기고자들은 일반 프로그래밍 및 오류 처리를 위한 디자인 초안을 발표하고 사용자들에게 피드백을 [36][37]제출하도록 요청했습니다.그러나 오류 처리 제안은 결국 [38]포기되었습니다.

2020년 6월, 일반 함수와 유형을 선언하기 위해 필요한 구문을 Go에 추가하는 새로운 초안 설계[39] 문서가 발행되었습니다.코드 번역 툴인 go2go가 제공되어 사용자가 새로운 구문을 사용해 볼 수 있게 되었습니다.또한 Generics 대응 버전의 온라인 Go [40]Playground를 사용할 수 있게 되었습니다.

버전 1.18에서 [41]Generics가 Go에 추가되었습니다.

버전 관리

Go 1은 언어 사양 및 표준 라이브러리의 주요 부분에 대한[42] 호환성을 보장합니다.현재 Go 1.18[43] 릴리즈까지의 모든 버전은 이 약속을 유지하고 있습니다.

각 메이저 Go 릴리즈는 새로운 메이저릴리즈가 [44]2개가 될 때까지 지원됩니다.

풀어주다 상황 발매일 유지 보수 종료
이전 버전, 더 이상 유지 보수되지 않음: go1 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2012-03-28 2013-12-01
이전 버전, 더 이상 유지 보수되지 않음: go1.1 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2013-05-13 2014-06-18
이전 버전, 더 이상 유지 보수되지 않음: go1.2 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2013-12-01 2014-12-10
이전 버전, 더 이상 유지 보수되지 않음: go1.3 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2014-06-18 2015-08-19
이전 버전, 더 이상 유지 보수되지 않음: go1.4 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2014-12-10 2016-02-17
이전 버전, 더 이상 유지 보수되지 않음: go 1.5 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2015-08-19 2016-08-15
이전 버전, 더 이상 유지 보수되지 않음: go 1.6 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2016-02-17 2017-02-16
이전 버전, 더 이상 유지 보수되지 않음: go1.7 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2016-08-15 2017-08-24
이전 버전, 더 이상 유지 보수되지 않음: go1.8 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2017-02-16 2018-02-16
이전 버전, 더 이상 유지 보수되지 않음: go1.9 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2017-08-24 2018-08-24
이전 버전, 더 이상 유지 보수되지 않음: go1.10 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2018-02-16 2019-02-25
이전 버전, 더 이상 유지 보수되지 않음: go1.11 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2018-08-24 2019-09-03
이전 버전, 더 이상 유지 보수되지 않음: go1.12 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2019-02-25 2020-02-25
이전 버전, 더 이상 유지 보수되지 않음: go1.13 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2019-09-03 2020-08-11
이전 버전, 더 이상 유지 보수되지 않음: go 1.14 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2020-02-25 2021-02-16
이전 버전, 더 이상 유지 보수되지 않음: go1.15 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2020-08-11 2021-08-16
이전 버전, 더 이상 유지 보수되지 않음: go1.16 이전 버전, 더 이상 유지 보수되지 않음: 사용 종료 2021-02-16 2022-03-15
이전 버전, 아직 유지 보수: go1.17 이전 버전이지만 유지 보수:유지 2021-08-16 2022년 3분기
현재 안정적인 버전: go1.18 현재 안정적인 버전: 현재의 2022-03-15 2023년 1분기
향후 출시: go1.19 향후 출시: 계획 완료 2022년 3분기 2023년 3분기
범례:
구버전
이전 버전, 아직 유지 관리됨
최신 버전
최신 프리뷰 버전
향후 출시

설계.

Go는 C(특히 Plan 9 방언[45][failed verificationsee discussion])의 영향을 받지만, 보다 단순성과 안전성에 중점을 둔다.구성 요소는 다음과 같습니다.

  • 동적 [46]언어에서 보다 일반적인 패턴을 채택하는 구문 및 환경:
– 옵션 간결한 변수 선언 및 유형 추론을 통한 초기화(x := 0대신int x = 0;또는var x = 0;)
– 빠른 컴파일[47]
– 리모트 패키지 관리 (go get[48]온라인 패키지 매뉴얼[49]
  • 특정 문제에 대한 독특한 접근법:
– 내장 동시성 프리미티브: 경량 프로세스(고루틴), 채널select진술
– 가상 상속 대신 인터페이스 시스템 비가상 상속 대신 타입 임베디드
– 기본적으로 외부 의존 없이 정적으로 링크된 네이티브 바이너리를 생성하는 툴 체인

구문

Go의 구문에는 코드를 간결하고 읽기 쉽게 하기 위한 C로부터의 변경이 포함되어 있습니다.프로그래머가 쓸 수 있도록 하는 복합 선언/초기화 연산자가 도입되었습니다.i := 3또는s := "Hello, world!"사용할 변수 유형을 지정하지 않습니다.이것은 C의 것과 대조된다.int i = 3;그리고.const char *s = "Hello, world!";세미콜론은 여전히 [b]문을 종료하지만 행의 끝이 나타날 때 [c]암묵적입니다.메서드는 여러 값을 반환할 수 있으며,result, errpair는 메서드가 [d]Go에서 발신자에게 오류를 나타내는 일반적인 방법입니다.Go는 이름으로 구조 매개변수를 초기화하고 지도와 슬라이스를 초기화하는 리터럴 구문을 추가합니다.C의 3가지 진술에 대한 대안으로for루프, Go'srange식을 사용하면 배열, 슬라이스, 문자열, 맵 및 [53]채널에 걸쳐 간결하게 반복할 수 있습니다.

종류들

Go에는 숫자 유형(바이트, int64, float32 등), 부언 및 문자열(문자열) 등 여러 가지 기본 제공 유형이 있습니다.문자열은 불변입니다.내장 연산자 및 키워드(함수가 아닌)는 연결, 비교 및 UTF-8 인코딩/[54]디코딩을 제공합니다.레코드 유형은 struct [55]키워드를 사용하여 정의할 수 있습니다.

유형 T 및 음이 아닌 정수 정수 n에 대해 [n]T 표기된 배열 유형이 있으므로 길이가 다른 배열의 유형이 다르다.동적 어레이는 "슬라이스"(일부 유형 T의 경우 []T)로 표시됩니다.어레이를 확장하기 위해 새 메모리를 할당해야 하는 시기를 지정하는 길이와 용량이 있습니다.여러 슬라이스가 기본 [34][56][57]메모리를 공유할 수 있습니다.

포인터는 모든 유형에 사용할 수 있으며, T형 포인터는 *T로 표시됩니다.주소 취득 및 간접은 C와 같이 & 및 * 연산자를 사용하거나 메서드콜 또는 Atribute 액세스 [58][59]구문을 통해 암묵적으로 발생합니다.특별한 안전하지 않은 경우를 제외하고 포인터 [e]산술은 없습니다.표준 [60]라이브러리의 포인터 유형입니다.

유형 K와 V 쌍에 대해 유형[K]V는 유형 K 키를 유형 V 값에 매핑하는 해시 테이블의 유형입니다.해시 테이블은 특별한 구문과 내장 함수를 사용하여 언어에 내장되어 있습니다.chan T는 동시 Go 프로세스 [61]Type T 값을 전송할 수 있는 채널입니다.

인터페이스를 지원하는 것 외에 Go의 타입 시스템은 유명무실합니다.type 키워드를 사용하여 새로운 이름 있는 타입을 정의할 수 있습니다.이러한 타입은 같은 레이아웃을 가진 다른 이름 있는 타입(구조체의 경우 같은 순서로 같은 멤버)과는 다릅니다.타입간의 변환(예를 들면, 다양한 정수 타입간의 변환 등)이 미리 정의되어 있어 새로운 타입을 추가하는 것으로, 변환을 정의할 수 있습니다만, 이름 있는 타입간의 변환은 항상 [62]명시적으로 실행할 필요가 있습니다.예를 들어, type 키워드를 사용하면, 32 비트의 부호 없는 정수에 근거해 IPv4 주소의 타입을 정의할 수 있습니다.

유형 ipv4 주소 uint32 

이 유형의 정의에서는 ipv4addr(x)uint32x를 IP 주소로 해석합니다.단순히 ipv4addr 유형의 변수에 x를 할당하는 것은 유형 [63]오류입니다.

상수 표현식은 입력 또는 "유형화"될 수 있습니다. 상수 표현식이 나타내는 값이 컴파일 시간 체크를 [64]통과하면 입력 변수에 할당될 때 유형이 지정됩니다.

함수 유형은 func 키워드로 나타납니다.이러한 타입은 0 이상의 파라미터사용하여 0 이상의 값을 반환합니다.이러한 값은 모두 입력됩니다.파라미터와 반환값에 따라 함수 유형이 결정됩니다.따라서 func(string, int32)(int, error)는 문자열과 32비트 부호 있는 정수를 사용하여 부호 있는 정수(기본 폭)와 삽입 인터페이스 유형 오류 [65]값을 반환하는 함수 유형입니다.

이름 있는 유형에는 메서드세트가 관련되어 있습니다.상기의 IP 주소의 예는, 그 값이 기존의 표준인지 아닌지를 확인하는 방법으로 확장할 수 있습니다.

// ZeroBroadcast 는, addr 이 255.255.255인지 아닌지를 보고합니다. 기능하다 (주소 ipv4 주소) 제로 브로드캐스트() 부울 {     돌아가다 주소 == 0xFFFFFFFF } 

이 메서드 정의에서는 공칭 입력으로 인해 메서드가 ipv4addr에 추가되지만 uint32에는 추가되지 않습니다.메서드에는 특별한 정의와 콜 구문이 있지만 고유한 [66]메서드유형은 없습니다.

인터페이스 시스템

Go는 클래스 [citation needed]상속을 대체하는 두 가지 기능을 제공합니다.

첫 번째는 임베딩으로,[67] 자동화된 형태의 구성으로 볼 수 있습니다.

두 번째는 런타임 다형성[68]: 266 제공하는 인터페이스입니다.인터페이스는 유형의 클래스이며, Go의 다른 명목형 시스템에서 제한된 형식의 구조 유형을 제공합니다.인터페이스 타입의 오브젝트도 베이스 클래스와 파생 클래스의 C++ 오브젝트와 마찬가지로 다른 타입입니다.Go 인터페이스는 Smalltalk 프로그래밍 [69]언어의 프로토콜을 따라 설계되었습니다.여러 [70][71]소스에서는 Go 인터페이스를 설명할 때 덕타이핑이라는 용어를 사용합니다.duck typing이라는 용어는 정확하게 정의되어 있지 않기 때문에 틀리지 않지만 일반적으로 형식 적합성이 정적으로 검사되지 않음을 의미합니다.Go 인터페이스에 대한 적합성은 Go 컴파일러에 의해 정적으로 검사되기 때문에(타입 어설션을 수행할 때를 제외), Go 작성자들은 [72]구조형이라는 용어를 선호한다.

인터페이스 유형의 정의에는 이름 및 유형별로 필요한 메서드가 나열됩니다.인터페이스 타입 I의 모든 필수 메서드와 일치하는 기능이 존재하는 타입 T의 오브젝트도 타입 I의 오브젝트입니다.유형 T의 정의는 유형 I을 식별할 필요가 없으며 식별할 수도 없습니다.예를 들어, 모양, 정사각형이 다음과 같이 정의되는 경우:

수입품 "수학"  유형 모양. 인터페이스 {     지역() 플로트 64 }  유형 광장 구조 { // 주의: "실장" 선언 없음      플로트 64 }  기능하다 (평방 광장) 지역() 플로트 64 { 돌아가다 평방. * 평방. }  유형 원형 구조 { // 여기에도 "실장" 선언이 없습니다.     반지름 플로트 64 }  기능하다 (c 원형) 지역() 플로트 64 { 돌아가다 수학.파이 * 수학.전원(c.반지름, 2) } 

그러면 정사각형과 이 모두 암시적으로 모양이며 모양 유형 [68]: 263–268 변수에 할당할 수 있습니다.공식 언어에서 Go의 인터페이스 시스템은 공칭 타이핑이 아닌 구조 타이핑을 제공합니다.인터페이스는, 다른 인터페이스를 짜넣을 수 있습니다.그 결과, 짜넣어진 인터페이스를 실장하는 타입과 새롭게 정의된 인터페이스가 [68]: 270 추가하는 모든 메서드에 의해서, 완전하게 만족하는 인터페이스를 작성할 수 있습니다.

Go 표준 라이브러리는 Reader 및 [68]: 282–283 Writer 개념을 기반으로 하는 입출력 시스템을 포함하여 여러 위치에서 인터페이스를 사용하여 범용성을 제공합니다.

인터페이스를 통한 호출 메서드 외에 Go에서는 런타임유형 체크를 사용하여 인터페이스 값을 다른 유형으로 변환할 수 있습니다.이를 위한 언어 구조는 단일 잠재적 유형과 대조하는 유형 [73]어설션과 여러 유형과 [citation needed]대조하는 유형 [74]스위치입니다.

인터페이스 interface{}는 모든 유형의 항목을 참조할 수 있기 때문에 중요한 베이스 케이스입니다.Java 또는 C#의 Object 클래스와 비슷하며 [68]: 284 int와 같은 삽입 유형을 포함하여 모든 유형에 대해 충족됩니다.빈 인터페이스를 사용하는 코드는 참조 대상 객체의 메서드(또는 임베디드 연산자)를 단순히 호출할 수는 없지만,interface{}값, 유형 어설션 또는 유형 스위치를 통해 보다 유용한 유형으로 변환하거나 Go's로 검사합니다.reflect패키지.[75]왜냐면interface{}임의의 값을 참조할 수 있습니다.이것은 스태틱타이핑의 제약에서 벗어날 수 있는 제한된 방법입니다.void*추가 런타임 유형 [citation needed]검사와 함께 C에 표시됩니다.

interface{}유형을 사용하여 JSON 또는 YAML 데이터와 같은 Go의 임의의 스키마의 구조화된 데이터를 모델링할 수 있습니다.map[string]interface{}(빈 인터페이스에 대한 문자열 맵).모든 [76]유형의 문자열 키와 값이 포함된 사전 형식의 데이터를 재귀적으로 설명합니다.

인터페이스 값은 데이터에 대한 포인터와 런타임 유형 [77]정보에 대한 두 번째 포인터를 사용하여 구현됩니다.Go에서 포인터를 사용하여 구현되는 다른 유형과 마찬가지로 인터페이스 값은 다음과 같습니다.nil초기화되지 [78]않은 경우.

매개 변수화된 유형을 사용하는 일반 코드

버전 1.18 이후 Go는 매개 변수화된 [79]유형을 사용하는 일반 코드를 지원합니다.

패키지 시스템

Go의 패키지 시스템에서는 각 패키지에 경로가 있습니다(예:"compress/bzip2"또는"golang.org/x/net/html"이름(예:bzip2또는html) 다른 패키지의 정의에 대한 참조는 항상 다른 패키지의 이름을 앞에 붙여야 하며, 다른 패키지의 대문자로 표시된 이름만 액세스할 수 있습니다.io.Reader공개되어 있지만bzip2.reader그렇지 않습니다.[80]go get명령어는 리모트저장소에[81] 저장된 패키지를 취득할 수 있으며 개발자는 소스저장소에 대응하는 베이스패스 내에서 패키지를 개발할 것을 권장합니다(표준 라이브러리 또는 기타 외부 라이브러리에 [82]대한 향후 추가와 이름 충돌 가능성을 줄이기 위해 example.com/user_name/package_name) 등).

동시성: 고루틴과 채널

Go 언어에는 동시 프로그램 작성을 위한 라이브러리 지원뿐만 아니라 내장 기능이 있습니다.동시성은 CPU의 병렬화뿐만 아니라 비동기화도 의미합니다.데이터베이스나 네트워크 읽기 등의 저속한 조작을 실행하면서 다른 프로그램을 실행할 수 있습니다(이벤트베이스 서버에서 [83]흔히 볼 수 있듯이).

주요 동시성 구성은 경량 프로세스의 일종인 고루틴입니다.가 프리픽스 되어 있는 함수콜go키워드를 지정하면 새로운 goroutine에서 기능이 시작됩니다.언어 사양에는 고루틴 구현 방법이 명시되어 있지 않지만, 현재 구현에서는 [84]: 10 Erlang에서 실행되는 스케줄링과 마찬가지로 Go 프로세스의 고루틴을 더 작은 운영 체제 스레드 세트에 다중화하고 있습니다.

대부분의 고전적인 동시성 제어 구조(뮤텍스 잠금 등)를 포함하는 표준 라이브러리 패키지를 사용할 [84]: 151–152 수 있지만, 관용적인 동시 프로그램들은 대신 고루틴 [85]간에 메시지를 보내는 채널선호합니다.옵션 버퍼는 메시지를 FIFO 순서로[86]: 43 저장하고 메시지를 [citation needed]수신하기 전에 goroutine을 전송할 수 있도록 합니다.

채널은 타입 T의 채널타입 T의 메시지 전송에만 사용할 수 있도록 입력됩니다.이 경우 특별한 구문이 사용됩니다.<-ch는 실행 중인 goroutine이 채널ch를 통해 값이 들어올 때까지 차단하는 식입니다.ch <-x x를 송신합니다(다른 goroutine이 값을 수신할 때까지 차단하는 경우도 있습니다).내장된 스위치같은 select 문을 사용하여 여러 채널에서 논블로킹 통신을 구현할 수 있습니다.예에 대해서는, 이하를 참조해 주세요.Go는 데이터를 안전하게 공유하기 위해 [87]고루틴이 채널이나 다른 작업을 어떻게 사용해야 하는지를 설명하는 메모리 모델을 가지고 있습니다.

채널 세트의 존재는 배우 모델 스타일의 동시 언어인 Erlang과 달리 배우에게 메시지가 직접 수신인 지정됩니다(고루틴에 해당).배우 스타일은 바둑에서 고루틴과 채널 간의 일대일 대응 관계를 유지함으로써 시뮬레이션할 수 있지만, 이 언어를 사용하면 여러 고루틴이 채널을 공유하거나 단일 고루틴이 여러 [84]: 147 채널에서 송수신할 수 있습니다.

이러한 툴로부터 워커 풀, 파이프라인(예를 들어 파일을 다운로드 할 때 압축 해제 및 해석), 타임아웃을 수반하는 백그라운드콜, 일련의 서비스에 대한 「팬아웃」패럴렐 콜등의 [88]동시 컨스트럭트를 구축할 수 있습니다.채널은 또한 재사용 [89]버퍼의 동시 안전 목록, Coroutines [90]구현(goroutine이라는 이름의 영감을 주는 데 도움이 됨) [91]반복기 구현과 같은 프로세스 간 통신의 일반적인 개념에서 더 많이 사용되고 있습니다.

동시성 관련 Go 구조 규칙(채널 및 대체 채널 입력)은 Tony Hoare의 통신 순차 프로세스 모델에서 파생되었습니다.Occam 또는 Limbo(Go의 공동 설계자인 Rob Pike가 [92]작업한 언어)와 같은 이전의 동시 프로그래밍 언어와는 달리 Go는 안전하고 검증 가능한 동시성 [93]개념을 제공하지 않습니다.Go에서는 통신 프로세스 모델이 선호되지만 프로그램 내의 모든 고루틴이 단일 주소 공간을 공유하는 유일한 모델이 아닙니다.즉, 고루틴 간에 가변 객체와 포인터를 공유할 수 있습니다.아래의 「레이스 조건의 안전성 결여」를 참조해 주세요.

병렬 프로그래밍에 대한 적합성

Go의 동시성 기능은 주로 병렬 [83]처리를 목적으로 하는 것은 아니지만 공유 메모리 멀티 프로세서 머신의 프로그래밍에 사용할 수 있습니다.[94]접근법의 효과에 대한 다양한 연구가 수행되었다.이들 연구 중 하나는 언어에 익숙하지 않은 베테랑 프로그래머가 작성한 프로그램의 크기(코드 단위)와 속도, 바둑 전문가(구글 개발팀 소속)가 수정한 프로그램을 비교했으며 채플, 실크인텔 TBB도 마찬가지였다.이 연구에 따르면 비전문가는 재귀당 1개의 go 스테이트먼트를 사용하여 divide-and-conquer 알고리즘을 작성하는 경향이 있는 반면, 전문가는 프로세서당 1개의 goroutine을 사용하여 distribute-work-synchronize 프로그램을 작성하는 것으로 나타났습니다.전문가의 프로그램은 대개 더 빠를 뿐 아니라 더 [95]길었다.

안전을 위한 경주 조건의 결여

Go의 동시성 접근법은 "메모리를 공유함으로써 소통하지 말고,[96] 통신을 통해 메모리를 공유한다"로 요약할 수 있다.Go-Routines가 공유 데이터에 액세스하는 방법에는 제한이 없으므로 레이스 조건이 가능합니다.특히, 프로그램이 채널이나 다른 수단을 통해 명시적으로 동기화되지 않는 한, 한 Go-Routine의 쓰기는 일부, 전체 또는 전혀 보이지 않을 수 있으며,[93] 대부분의 경우 쓰기 순서에 대한 보장이 없습니다.또한 인터페이스 값, 슬라이스 헤더, 해시 테이블 및 문자열 헤더와 같은 Go의 내부 데이터 구조는 레이스 조건에 영향을 받지 않으므로 이러한 유형의 공유 인스턴스를 [97][98]동기화하지 않고 수정하는 멀티스레드 프로그램에서 유형 및 메모리 안전이 침해될 수 있습니다.언어 지원 대신 안전한 동시 프로그래밍은 관례에 의존합니다. 예를 들어 Chisnall은 "aliases xor mutable"이라는 관용어를 권장합니다. 즉, 채널을 통해 가변값(또는 포인터)을 전달하면 해당 값을 [84]: 155 수신자에게 이전하는 것을 의미합니다.

바이너리

gc 툴체인의 링커는 기본적으로 정적으로 링크된 바이너리를 만듭니다.따라서 모든 Go 바이너리에는 Go [99][100]런타임이 포함됩니다.

누락

Go는 (실장) 상속, 어설션,[f] 포인터 [e]산술, 암묵적 유형 변환, 태그 없는 [g]결합 및 태그 부착 [h]결합을 포함하여 다른 언어에서 공통적인 특정 기능을 의도적으로 생략합니다.디자이너들은 세 사람 모두가 [103]동의한 시설만 추가했다.

생략된 언어 특징 중, 설계자는 어설션과 포인터 산술에 대해 명시적으로 반론을 제기하는 한편, 유형 상속을 생략하는 선택을 보다 유용한 언어를 제공하는 것으로 방어하고, 대신 동적[i] 디스패치 및 코드 재사용을 위한 구성을 달성하기 위한 인터페이스의 사용을 장려한다.사실 구성 위임이 구조 임베딩에 의해 대부분 자동화된다; 연구원 Schmager 등에 따르면, 이 기능은 "상속의 많은 결점을 가지고 있다: 개체의 공개 인터페이스에 영향을 미치고, 세분화되지 않는다(즉, 임베딩에 대한 메서드 레벨 제어 없음), 임베디드 객체의 방법은 숨길 수 없으며, 안정적이다"고 한다.다른 언어의 프로그래머가 [67]상속을 남용하는 것으로 평판이 날 정도로 프로그래머가 이를 남용할지는 "명백하지 않다"고 명시했다.

Go에서는 "복잡도에 비례하는 가치를 부여하는 설계"[104]가 없기 때문에 예외 처리가 처음에는 생략되었습니다.예외적인 패닉/복구 메커니즘으로 통상의 문제를 회피try-catch2010년 3월 30일 [106]스냅샷에서 제어 구조가 제안되어 공개되었습니다[105].Go 작성자들은 프로그램 또는 서버 요청 전체를 중지해야 하는 오류와 같은 복구할 수 없는 오류 또는 패키지 [107][108]내의 스택에 오류를 전파하는 지름길로 사용할 것을 권장합니다.패키지 경계를 넘어 Go에는 표준 오류 유형이 포함되며 이 유형을 사용하는 다중 값 반환이 [11]표준 관용어입니다.

스타일.

바둑 저자들은 바둑 프로그램의 스타일에 영향을 미치는데 상당한 노력을 기울였습니다.

  • 코드의 들여쓰기, 간격 및 기타 표면 수준의 세부 사항은 에 의해 자동으로 표준화됩니다.gofmt탭은 들여쓰기, 공백은 정렬에 사용합니다.정렬은 편집기가 고정 너비 [109]글꼴을 사용하고 있다고 가정합니다. golint는 추가 스타일을 자동으로 확인하지만 Go 유지 [110]관리자에 의해 사용되지 않고 보관되었습니다.
  • Go와 함께 배포된 툴과 라이브러리는 API 문서와 같은 표준 접근 방식을 제안합니다.godoc테스트([111]go test, 빌딩 (go build패키지 관리(go get등입니다.
  • Go는 순환 종속성, 사용되지[112] 않는 변수 또는 [113]가져오기 금지, 암묵적 유형 변환 등 다른 언어의 권장 사항인 규칙을 적용합니다.
  • 특정 기능의 생략(예를 들어 다음과 같은 기능 프로그래밍 단축키)map및 Java 스타일try/finallyblocks)는 특정 명시적이고 구체적이며 명령적인 프로그래밍 스타일을 장려하는 경향이 있습니다.
  • 첫째 날 바둑 팀은 바둑 [111]숙어 모음을 출판했고, 나중에 바둑 스타일과 코딩 철학을 가르치기 위해 코드 리뷰 코멘트,[114] [115]토크, 공식 블로그[116] 게시물도 수집했다.

도구들

주요 Go 배포에는 코드 구축, 테스트분석위한 도구가 포함됩니다.

  • go build소스 파일 자체의 정보만 사용하여 Go 바이너리를 구축하며 별도의 makefile은 사용하지 않습니다.
  • go test유닛 테스트 및 마이크로벤치마크용
  • go fmt코드 포맷용
  • go install, 리모트 패키지를 취득해 인스톨 합니다.
  • go vet코드 내의 잠재적인 오류를 찾는 스태틱아나라이저
  • go run코드 구축 및 실행을 위한 숏컷
  • godoc매뉴얼 표시 또는 HTTP 경유 서비스용
  • gorename변수, 함수 등의 이름을 타입 세이프 방식으로 변경합니다.
  • go generate코드 생성기를 호출하는 표준 방법
  • go mod새로운 모듈 작성, 의존관계 추가, 의존관계 업그레이드 등

프로파일링 디버깅 지원, 런타임 인스트루먼트(를 들어 가비지 수집 일시정지 추적) 및 레이스 조건 테스터도 포함됩니다.

서드파티제의 툴 에코시스템은 다음과 같은 표준 배포에 추가됩니다.gocode많은 텍스트 편집기에서 코드 자동 완성을 활성화합니다.goimports필요에 따라 패키지 Import를 자동으로 추가/삭제합니다.errcheck의도하지 않게 에러를 무시할 가능성이 있는 코드를 검출합니다.

안녕 세계

패키지 주된  수입품 "fmt"  기능하다 주된() {     fmt.인쇄('헬로 월드') } 

여기서 "fmt"는 포맷된 I/O용 패키지이며 C의 C 파일 입력/[117]출력과 유사합니다.

동시성

다음의 간단한 프로그램은 비동기 프로그램을 구현하기 위한 Go의 동시성 기능을 보여줍니다.2개의 경량 스레드("goroutines")가 기동됩니다.하나는 사용자가 텍스트를 입력할 때까지 대기하고 다른 하나는 타임아웃을 실행합니다.선택한 문장은 이러한 고루틴 중 하나가 주요 루틴에 메시지를 보낼 때까지 기다렸다가 첫 번째 메시지가 도착할 때 작동합니다(David Chisnall의 [84]: 152 책에서 개작한 예).

패키지 주된  수입품 (     "fmt"     "시간" )  기능하다 리워드( 찬스 스트링) {     fmt.인쇄("단어를 입력하고 Enter 키를 누릅니다.")     변화하다 단어 스트링     fmt.스캔프(%s, &단어)      <-> 단어 }  기능하다 타임아웃(t 찬스 부울) {     시간을.수면.(5 * 시간을.둘째)     t <-> 거짓의 }  기능하다 주된() {     t := 만들다(찬스 부울)     가세요 타임아웃(t)       := 만들다(찬스 스트링)     가세요 리워드()      선택한다. {     사례. 단어 := <->:         fmt.인쇄("수신 완료, 단어)     사례. <->t:         fmt.인쇄("타임아웃")     } } 

테스트

테스트 패키지는 Go [118]패키지의 자동 테스트를 지원합니다.대상 함수의 예:

기능하다 사용자 이름 추출(이메일 스트링) 스트링 {   := 줄들.색인(이메일, "@")  돌아가다 이메일[:] } 

테스트 코드(Assert 키워드가 Go에 없는 것에 주의해 주세요.테스트는 같은 패키지로 <filename>_test.go에서 실행됩니다).

수입품 (     "실패"     )  기능하다 Test Extract Username (Test Extract Username)(t *테스트.T) {  t.달려.("점 없음", 기능하다(t *테스트.T) {   사용자 이름 := 사용자 이름 추출("r@google.com")   한다면 사용자 이름 != "r" {    t.파탈프("취득: %v\n", 사용자 이름)   }  })   t.달려.("도트 포함", 기능하다(t *테스트.T) {   사용자 이름 := 사용자 이름 추출("jonh.smith@example.com")   한다면 사용자 이름 != "jonh.smith" {    t.파탈프("취득: %v\n", 사용자 이름)   }  }) } 

테스트를 병렬로 실행할 수 있습니다.

웹 앱

net/http 패키지는 웹 응용 프로그램 작성을 지원합니다.

이 예에서는 localhost:8080을 방문했을 때 "Hello world!"가 표시됩니다.

패키지 주된  수입품 (     "fmt"     "로그     "net/interface"     )  기능하다 헬로 펑크(w http.ResponseWriter(응답 작성기), r *http.부탁한다) {     fmt.인쇄(w, "헬로우 월드!") }  기능하다 주된() {     http.핸들 펑크("/", 헬로 펑크)     로그..치명적(http.ListenAndServe(":8080", 제로)) } 

적용들

Go로 작성된 일부 주목할 만한 오픈 소스 애플리케이션은 다음과 같습니다.[119]

  • Caddy, 자동 HTTPS 기능을 갖춘 오픈 소스 HTTP/2 웹 서버
  • RockleDB, 오픈 소스, 존속 가능, 강력한 일관성, 스케일아웃 SQL 데이터베이스
  • Permister는 DNS 기반 서비스 검출을 위한 소프트웨어이며 분산 키 밸류 스토리지, 세그먼트화 및 구성을 제공합니다.
  • Docker(Linux 컨테이너를 도입하기 위한 도구 세트)
  • EdgeXLinux Foundation이 호스팅하는 벤더 중립형 오픈 소스 플랫폼으로 산업용 IoT 엣지[120] 컴퓨팅에 공통 프레임워크를 제공합니다.
  • 정적 사이트 생성기, Hugo
  • InflusionDB는 고가용성과 고성능 요건을 가진 시계열 데이터를 처리하기 위한 오픈 소스 데이터베이스입니다.
  • InterPlanetary File System(콘텐츠 주소 지정이 가능한 피어 투 피어 하이퍼 미디어[121] 프로토콜)
  • Ubuntu Linux 패키지 매니저인 Canonical의 서비스 오케스트레이션 툴인 Juju
  • Kubernetes 컨테이너 관리 시스템
  • lnd, Bitcoin Lightning[122] Network 구현
  • 가장 중요한 것은 팀채팅 시스템
  • NATS 메시징, 성능, 확장성 및 사용[123] 편의성의 핵심 설계 원칙을 제공하는 오픈 소스 메시징 시스템
  • OpenShift, Red Hat의 클라우드 컴퓨팅 플랫폼 as a Service
  • 클라우드 스토리지 및 기타 대기 시간이 긴 서비스의 파일을 관리하는 명령줄 프로그램인 Rclone
  • Canonical이 개발한 Ubuntu Touch 패키지 매니저인 Snappy
  • 오픈 소스 파일 동기화 클라이언트/서버 응용 프로그램인 Syncting
  • HashiCorp의 오픈 소스 다중 클라우드 인프라 프로비저닝 툴인 Terraform
  • PingCAP의 MySQL 프로토콜과 호환되는 오픈 소스 분산 HTAP 데이터베이스인 TiDB
  • arctil, Web 보안 평가 도구

Go를 사용하는 기타 주목할 만한 기업 및 사이트는 다음과 같습니다(배타적이지 않고 일반적으로 다른 언어와 함께 사용).

Wikidata 관련 쿼리를 참조하십시오.

접수처

인터페이스 시스템과 상속의 고의적인 누락은 Michele Simionato에 의해 칭찬받았는데, 그는 이러한 특성을 Standard ML의 특징과 비교하면서 "특정 [148]경로를 따르는 대중 언어가 없다는 것이 유감"이라고 말했다.

엔진 야드의 Dave Astels는 [149]2009년에 다음과 같이 말했습니다.

바둑은 다이빙하기 매우 쉽다.최소한의 기본적인 언어 개념이 있으며 구문은 명확하고 모호하지 않도록 설계되어 있습니다.바둑은 아직 실험적이고 가장자리가 약간 거칠다.

Go는 2009년 첫해 TIOBE Programming Community Index에 의해 다른 어떤 언어보다 12개월(11월 도입 후 불과 2개월 만에)의 인기 상승으로 올해의 프로그래밍 언어로 선정되었으며,[150] 2010년 1월에는 파스칼과 같은 확립된 언어를 제치고 13위에 올랐다.2015년 6월에는 50위 이하로 순위가 떨어져 [151]COBOL과 Fortran보다 순위가 낮았다.그러나 2017년 1월 현재 순위는 13위까지 치솟아 인기와 채택률이 크게 상승한 것으로 나타났다.바둑은 2016년 올해의 TIOBE 프로그래밍 언어를 수상했다.

Bruce Ekel은 다음과 같이 말했다.[152]

C++의 복잡성(새로운 C++에서는 한층 더 복잡성이 추가되어 생산성에 미치는 영향)은 더 이상 정당화되지 않습니다.C++ 프로그래머가 C 호환 언어를 사용하기 위해 거쳐야 했던 모든 홉은 더 이상 의미가 없습니다. 시간과 노력을 낭비하는 것일 뿐입니다.Go는 원래 C++가 해결하려고 했던 문제 클래스에 훨씬 더 적합합니다.

2011년 구글 엔지니어가 C++(GCC), Java 및 Scala와 비교한 언어와 그 gc 구현에 대해 평가한 결과 다음과 같이 나타났습니다.

Go는 또한 간결하고 표준화된 표기법을 허용하는 흥미로운 언어 기능을 제공합니다.이 언어의 컴파일러는 아직 미숙하기 때문에 퍼포먼스와 바이너리 사이즈가 모두 반영됩니다.

--

그 평가는 바둑 개발팀으로부터 반박을 받았다.Hundt의 논문을 위해 바둑 코드를 개선한 Ian Lance Taylor는 그의 코드를 공개하려는 의도를 알지 못했고, 그의 버전은 "관례적이거나 효율적인 바둑의 예가 될 의도가 전혀 없었다"고 말했다. 그 후 Russ Cox는 바둑 코드와 C++ 코드를 최적화했고, 바둑 코드가 C+나 O+보다 약간 더 빠르게 실행되도록 했다.신문에 [154]나온 코드보다 훨씬 더 빠른 속도입니다.

명명 분쟁

2009년 11월 10일, Go! 프로그래밍 언어 개발자인 프랜시스 맥케이브는 구글 언어와의 [155]혼동을 방지하기 위해 구글 언어의 이름을 변경해 줄 것을 요청했습니다.McCabe는 "'거물'이 결국 그를 압도하게 될 것"이라는 우려를 제기했고, 이러한 우려는 구글의 공식 이슈에 대해 120명이 넘는 개발자들에게 반향을 일으켰으며, 일부는[156] 심지어 이 문제가 구글의 모토인 "구글의 모토"와 모순된다고 말했다.사악하게 굴지 마.[157]

2010년 10월 12일, Google 개발자 Russ Cox(@rsc)에 의해서, 다음의 코멘트와 함께 커스텀 스테이터스 「Unfortunate」가 발행이 종료되었습니다.

"Go라는 이름의 컴퓨팅 제품과 서비스가 많이 있습니다.발매 후 11개월 동안 두 언어의 [157]혼동은 거의 없었습니다.

비판

비평가들은 다음과 같이 말합니다.

  • Go의 0대수적 유형의 부족이 결합되어 실패와 베이스 [158][159]케이스를 처리하는 데 어려움이 생깁니다.
  • Go는 여는 괄호가 자체 줄에 나타나는 것을 허용하지 않으므로 모든 Go 프로그래머가 동일한 가새 [160]스타일을 사용해야 합니다.
  • Go 표준 라이브러리의 파일 시멘틱스는 POSIX 시멘틱스에 크게 기반하여 Windows 플랫폼[161][162]잘 매핑되지 않습니다.이 문제는 Go만의 문제는 아니지만 다른 프로그래밍 언어에서는 잘 정의된 표준 라이브러리를 통해 해결되었습니다.
  • 한 연구에 따르면 메시지 전달을 통한 동시성 버그는 공유 메모리와 마찬가지로 쉽게 발생하며 때로는 더 많은 [163]버그를 발생시킬 수 있습니다.

「 」를 참조해 주세요.

메모들

  1. ^ 대체 백엔드를 사용하면 컴파일 속도가 느려지고 가비지 수집에 대한 Go의 제어가 가능하지만 머신 코드 [18]최적화가 향상됩니다.
  2. ^ 그러나 "복잡한 문장이 한 줄을 차지할 수 있도록 하기 위해 세미콜론은 닫힘) 또는 }[51] 앞에 생략할 수 있습니다."
  3. ^ "문장이 끝날 수 있는 토큰 뒤에 줄바꿈이 있으면 [렉서]가 세미콜론을 삽입합니다."[52]
  4. ^ 통상, 결과값과 에러값의 어느 쪽인가에는, 타입의 제로치 이외의 값이 있습니다.읽기 또는 쓰기를 부분적으로만 완료할 수 있는 경우와 같이, 어느 쪽도 완료할 수 없는 경우가 있습니다(읽기가 0바이트를 반환하는 경우).'반증명서 문제' 참조: 복수치 반환.
  5. ^ a b 언어 FAQ "왜 포인터 산술이 없습니까?안전...올바르지 않게 성공하는 부정한 주소를 취득하는 일은 없습니다.어레이 인덱스를 사용하면 ... 포인터 산술 ... 가비지 컬렉터의 구현을 단순화할 수 있습니다."[11]
  6. ^ 언어 FAQ: "왜 Go에는 어설션이 없습니까?...프로그래머들은 에러 처리와 리포팅에 대해 제대로 생각하지 않기 위해 어설션을 목발처럼 사용해 왔습니다..."[11]
  7. ^ 언어 FAQ "왜 태그 없는 조합은...?"(그것들은) 바둑의 기억 안전 [11]보장을 위반할 것이다."
  8. ^ 언어 FAQ "Go에 변종 타입이 없는 이유는 무엇입니까?"검토했습니다만, 인터페이스와 중복되는 부분이 있습니다.[S]이미 커버되어 있는 바리안트 타입의 주소 중 하나.단,[11] 우아한 것은 아닙니다.(인터페이스[101] 타입의 태그는 타입[102] 어설션으로 액세스 됩니다.)
  9. ^ 언어 [11]FAQ의 "메서드의 동적 디스패치를 받는 방법" 및 "유형 상속이 없는 이유는 무엇입니까?"에 대한 질문입니다.

레퍼런스

  1. ^ "Is Go an object-oriented language?". Retrieved April 13, 2019. Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy.
  2. ^ "Go: code that grows with grace". Retrieved June 24, 2018. Go is Object Oriented, but not in the usual way.
  3. ^ a b "Text file LICENSE". The Go Programming Language. Retrieved October 5, 2012.
  4. ^ https://go.dev/doc/devel/release#go1.19.
  5. ^ a b "Why doesn't Go have "implements" declarations?". golang.org. Retrieved October 1, 2015.
  6. ^ Pike, Rob (December 22, 2014). "Rob Pike on Twitter". Retrieved March 13, 2016. Go has structural typing, not duck typing. Full interface satisfaction is checked and required.
  7. ^ "lang/go: go-1.4 – Go programming language". OpenBSD ports. December 23, 2014. Retrieved January 19, 2015.
  8. ^ "Go Porting Efforts". Go Language Resources. cat-v. January 12, 2010. Retrieved January 18, 2010.
  9. ^ "Additional IP Rights Grant". The Go Programming Language. Retrieved October 5, 2012.
  10. ^ Kincaid, Jason (November 10, 2009). "Google's Go: A New Programming Language That's Python Meets C++". TechCrunch. Retrieved January 18, 2010.
  11. ^ a b c d e f g "Language Design FAQ". golang.org. January 16, 2010. Retrieved February 27, 2010.
  12. ^ a b Metz, Cade (May 5, 2011). "Google Go boldly goes where no code has gone before". The Register.
  13. ^ "Is the language called Go or Golang?". Retrieved March 16, 2022. The language is called Go.
  14. ^ "Go 1.5 Release Notes". Retrieved January 28, 2016. The compiler and runtime are now implemented in Go and assembler, without C.
  15. ^ "Go 1.11 is Released - The Go Blog". August 24, 2018. Retrieved January 1, 2019.
  16. ^ "Installing GCC: Configuration". Retrieved December 3, 2011. Ada, Go and Objective-C++ are not default languages
  17. ^ "FAQ: Implementation". golang.org. August 2, 2021. Retrieved August 2, 2021.
  18. ^ "gollvm § Is gollvm a replacement for the main Go compiler? (gc)". Git at Google.
  19. ^ "A compiler from Go to JavaScript for running Go code in a browser: Gopherjs/Gopherjs". GitHub. April 18, 2020.
  20. ^ "Go at Google: Language Design in the Service of Software Engineering". Retrieved October 8, 2018.
  21. ^ Pike, Rob (April 28, 2010). "Another Go at Language Design". Stanford EE Computer Systems Colloquium. Stanford University. 비디오가 표시된다.
  22. ^ "Frequently Asked Questions (FAQ) - The Go Programming Language". golang.org. Retrieved February 26, 2016.
  23. ^ Binstock, Andrew (May 18, 2011). "Dr. Dobb's: Interview with Ken Thompson". Archived from the original on January 5, 2013. Retrieved February 7, 2014.
  24. ^ Pike, Rob (2012). "Less is exponentially more".
  25. ^ Griesemer, Robert (2015). "The Evolution of Go".
  26. ^ Griesemer, Robert; Pike, Rob; Thompson, Ken; Taylor, Ian; Cox, Russ; Kim, Jini; Langley, Adam. "Hey! Ho! Let's Go!". Google Open Source. Retrieved May 17, 2018.
  27. ^ Shankland, Stephen (March 30, 2012). "Google's Go language turns one, wins a spot at YouTube: The lower-level programming language has matured enough to sport the 1.0 version number. And it's being used for real work at Google". News. CNet. CBS Interactive Inc. Retrieved August 6, 2017. Google has released version 1 of its Go programming language, an ambitious attempt to improve upon giants of the lower-level programming world such as C and C++.
  28. ^ "Release History - The Go Programming Language". golang.org.
  29. ^ "Go FAQ: Is Google using Go internally?". Retrieved March 9, 2013.
  30. ^ "Go fonts – The Go Blog". Go. November 16, 2016. Retrieved March 12, 2019.
  31. ^ "Go Font TTFs". GitHub. Retrieved April 2, 2019.
  32. ^ "Go's New Brand". The Go Blog. Retrieved November 9, 2018.
  33. ^ Merrick, Alice (March 9, 2021). "Go Developer Survey 2020 Results". Go Programming Language. Retrieved March 16, 2022.
  34. ^ a b Pike, Rob (September 26, 2013). "Arrays, slices (and strings): The mechanics of 'append'". The Go Blog. Retrieved March 7, 2015.
  35. ^ "E2E: Erik Meijer and Robert Griesemer – Going Go". Channel 9. Microsoft. May 7, 2012.
  36. ^ "Go 2 Draft Designs". Retrieved September 12, 2018.
  37. ^ "The Go Blog: Go 2 Draft Designs". August 28, 2018.
  38. ^ "Proposal: A built-in Go error check function, "try"". Go repository on GitHub. Retrieved March 16, 2022.
  39. ^ "Type Parameters - Draft Design". go.googlesource.com.
  40. ^ "Generics in Go". bitfieldconsulting.com.
  41. ^ "Go 1.18 is released!". Go Programming Language. March 15, 2022. Retrieved March 16, 2022.
  42. ^ "Go 1 and the Future of Go Programs - The Go Programming Language". golang.org.
  43. ^ "Go 1.18 Release Notes - The Go Programming Language". go.dev.{{cite web}}: CS1 maint :url-status (링크)
  44. ^ "Release History - The Go Programming Language". golang.org.
  45. ^ "A Quick Guide to Go's Assembler - The Go Programming Language". go.dev. Retrieved December 31, 2021.
  46. ^ Pike, Rob. "The Go Programming Language". YouTube. Retrieved July 1, 2011.
  47. ^ Pike, Rob (November 10, 2009). The Go Programming Language (flv) (Tech talk). Google. Event occurs at 8:53.
  48. ^ "Download and install packages and dependencies - go - The Go Programming Language". 일부 패키지의 주소와 설명서에 대해서는, godoc.org 를 참조해 주세요.
  49. ^ "GoDoc". godoc.org.
  50. ^ Pike, Rob. "The Changelog" (Podcast).
  51. ^ "Go Programming Language Specification, §Semicolons". golang.org.
  52. ^ "Effective Go, §Semicolons". golang.org.
  53. ^ "The Go Programming Language Specification - The Go Programming Language". golang.org.
  54. ^ Pike, Rob (October 23, 2013). "Strings, bytes, runes and characters in Go".
  55. ^ Doxsey, Caleb. "Structs and Interfaces — An Introduction to Programming in Go". www.golang-book.com. Retrieved October 15, 2018.
  56. ^ Gerrand, Andrew. "Go Slices: usage and internals".
  57. ^ The Go Authors. "Effective Go: Slices".
  58. ^ The Go authors. "Selectors - The Go Programming Language Specification".
  59. ^ The Go authors. "Calls - The Go Programming Language Specification".
  60. ^ "Go Programming Language Specification, §Package unsafe". golang.org.
  61. ^ "The Go Programming Language Specification - The Go Programming Language". go.dev. Retrieved December 31, 2021.
  62. ^ "The Go Programming Language Specification". golang.org.
  63. ^ "A tour of go". go.dev.
  64. ^ "The Go Programming Language Specification". golang.org.
  65. ^ "The Go Programming Language Specification - The Go Programming Language". go.dev. Retrieved December 31, 2021.
  66. ^ "The Go Programming Language Specification". golang.org.
  67. ^ a b Schmager, Frank; Cameron, Nicholas; Noble, James (2010). GoHotDraw: evaluating the Go programming language with design patterns. Evaluation and Usability of Programming Languages and Tools. ACM.
  68. ^ a b c d e Balbaert, Ivo (2012). The Way to Go: A Thorough Introduction to the Go Programming Language. iUniverse.
  69. ^ "The Evolution of Go". talks.golang.org. Retrieved March 13, 2016.
  70. ^ Diggins, Christopher (November 24, 2009). "Duck Typing and the Go Programming Language". Dr. Dobb's, The world of software development. Retrieved March 10, 2016.{{cite web}}: CS1 maint :url-status (링크)
  71. ^ Ryer, Mat (December 1, 2015). "Duck typing in Go". Retrieved March 10, 2016.
  72. ^ "Frequently Asked Questions (FAQ) - The Go Programming Language". golang.org.
  73. ^ "The Go Programming Language Specification". golang.org.
  74. ^ "The Go Programming Language Specification". golang.org.
  75. ^ "reflect package - reflect - pkg.go.dev". pkg.go.dev.
  76. ^ "map[string]interface{} in Go". bitfieldconsulting.com.
  77. ^ "Go Data Structures: Interfaces". Retrieved November 15, 2012.
  78. ^ "The Go Programming Language Specification". golang.org.
  79. ^ "Go 1.18 Release Notes: Generics". Go Programming Language. March 15, 2022. Retrieved March 16, 2022.
  80. ^ "A Tutorial for the Go Programming Language". The Go Programming Language. Retrieved March 10, 2013. In Go the rule about visibility of information is simple: if a name (of a top-level type, function, method, constant or variable, or of a structure field or method) is capitalized, users of the package may see it. Otherwise, the name and hence the thing being named is visible only inside the package in which it is declared.
  81. ^ "go - The Go Programming Language". golang.org.
  82. ^ "How to Write Go Code". golang.org. The packages from the standard library are given short import paths such as "fmt" and "net/http". For your own packages, you must choose a base path that is unlikely to collide with future additions to the standard library or other external libraries. If you keep your code in a source repository somewhere, then you should use the root of that source repository as your base path. For instance, if you have an Example account at example.com/user, that should be your base path
  83. ^ a b Pike, Rob (September 18, 2012). "Concurrency is not Parallelism".
  84. ^ a b c d e Chisnall, David (2012). The Go Programming Language Phrasebook. Addison-Wesley. ISBN 9780132919005.
  85. ^ "Effective Go". golang.org.
  86. ^ Summerfield, Mark (2012). Programming in Go: Creating Applications for the 21st Century. Addison-Wesley.
  87. ^ "The Go Memory Model". Retrieved April 10, 2017.
  88. ^ "Go Concurrency Patterns". golang.org.
  89. ^ Graham-Cumming, John (August 24, 2013). "Recycling Memory Buffers in Go".
  90. ^ "tree.go".
  91. ^ Cheslack-Postava, Ewen. "Iterators in Go".
  92. ^ Kernighan, Brian W. "A Descent Into Limbo".
  93. ^ a b "The Go Memory Model". Retrieved January 5, 2011.
  94. ^ Tang, Peiyi (2010). Multi-core parallel programming in Go (PDF). Proc. First International Conference on Advanced Computing and Communications. Archived from the original (PDF) on September 9, 2016. Retrieved May 14, 2015.
  95. ^ Nanz, Sebastian; West, Scott; Soares Da Silveira, Kaue. Examining the expert gap in parallel programming (PDF). Euro-Par 2013. CiteSeerX 10.1.1.368.6137.
  96. ^ Go Authors. "Share Memory By Communicating".
  97. ^ Cox, Russ. "Off to the Races".
  98. ^ Pike, Rob (October 25, 2012). "Go at Google: Language Design in the Service of Software Engineering". Google, Inc. "중요한 경고가 하나 있습니다.Go는 동시 실행이 존재하는 경우 메모리만으로 안전한 것은 아닙니다."
  99. ^ "Frequently Asked Questions (FAQ) - the Go Programming Language".
  100. ^ "A Story of a Fat Go Binary". September 21, 2018.
  101. ^ "Go Programming Language Specification, §Interface types". golang.org.
  102. ^ "Go Programming Language Specification, §Type assertions". golang.org.
  103. ^ All Systems Are Go. informIT. August 17, 2010. Retrieved June 21, 2018.
  104. ^ "Language Design FAQ". November 13, 2009. Archived from the original on November 13, 2009.
  105. ^ "Proposal for an exception-like mechanism". golang-nuts. March 25, 2010. Retrieved March 25, 2010.
  106. ^ "Weekly Snapshot History". golang.org.
  107. ^ "Panic And Recover". Go wiki.
  108. ^ "Effective Go". golang.org.
  109. ^ "gofmt - The Go Programming Language". golang.org. Retrieved February 5, 2021.
  110. ^ "golang/lint public archive". github.com.
  111. ^ a b "Effective Go". golang.org.
  112. ^ "Unused local variables". yourbasic.org. Retrieved February 11, 2021.
  113. ^ "Unused package imports". yourbasic.org. Retrieved February 11, 2021.
  114. ^ "Code Review Comments". GitHub. Retrieved July 3, 2018.
  115. ^ "Talks". Retrieved July 3, 2018.
  116. ^ "Errors Are Values". Retrieved July 3, 2018.
  117. ^ "fmt - The Go Programming Language". golang.org. Retrieved April 8, 2019.
  118. ^ "testing - The Go Programming Language". golang.org. Retrieved December 27, 2020.
  119. ^ avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software, retrieved January 10, 2018
  120. ^ "EdgeX Foundry Project". GitHub. Retrieved February 6, 2021.
  121. ^ "ipfs/go-ipfs". GitHub. Retrieved June 1, 2018.
  122. ^ "lightningnetwork/lnd", GitHub, retrieved April 29, 2020
  123. ^ "NATS - Open Source Messaging System Secure, Native Cloud Application Development".
  124. ^ "arctil - Web security assesment tool".
  125. ^ "Test driven development in Go Cacoo". Cacoo. July 29, 2016. Retrieved June 1, 2018.
  126. ^ "Chango". GitHub.
  127. ^ Heller, Martin (July 17, 2014). "Review: Cloud Foundry brings power and polish to PaaS". JavaWorld. Retrieved January 22, 2019.
  128. ^ Graham-Cumming, John (July 3, 2012). "Go at CloudFlare".
  129. ^ Graham-Cumming, John (November 11, 2013). "What we've been doing with Go".
  130. ^ "Go at CoreOS". November 25, 2014.
  131. ^ "Couchbase". GitHub.
  132. ^ Lee, Patrick (July 7, 2014). "Open Sourcing Our Go Libraries".
  133. ^ "Official Go implementation of the Ethereum protocol". GitHub. ethereum. April 18, 2020.
  134. ^ "Why we use Ruby on Rails to build GitLab". GitLab. Retrieved February 6, 2021. Ruby was optimized for the developer, not for running it in production," says Sid. "For the things that get hit a lot and have to be very performant or that, for example, have to wait very long on a system IO, we rewrite those in Go ... We are still trying to make GitLab use less memory. So, we'll need to enable multithreading. When we developed GitLab that was not common in the Ruby on Rails ecosystem. Now it's more common, but because we now have so much code and so many dependencies, it's going to be a longer path for us to get there. That should help; it won't make it blazingly fast, but at least it will use less memory{{cite web}}: CS1 maint :url-status (링크)
  135. ^ "dl.google.com: Powered by Go". golang.org.
  136. ^ Welsh, Matt (August 18, 2013). "Rewriting a Large Production System in Go".
  137. ^ Symonds, David. "High Performance Apps on Google App Engine".
  138. ^ "Mongo DB". GitHub. April 18, 2020.
  139. ^ "The Netflix Tech Blog: Application data caching using SSDs". May 25, 2016.
  140. ^ "golang/go". GitHub. April 18, 2020.
  141. ^ Sacks, Steven. "Search & Advances". plug.dj tech blog. Archived from the original on June 11, 2015. Retrieved June 10, 2015.
  142. ^ Jenkins, Tim (March 6, 2014). "How to Convince Your Company to Go With Golang". SendGrid's Email Deliverability Blog.
  143. ^ Bourgon, Peter. "Go at SoundCloud". Archived from the original on November 11, 2013.
  144. ^ "Go at Google I/O and Gopher SummerFest - The Go Blog". golang.org.
  145. ^ TWSTRIKE (April 17, 2020). "CoyIM". ThoughtWorks STRIKE team.
  146. ^ Hiltner, Rhys (July 5, 2016). "Go's march to low-latency GC".
  147. ^ "How We Built Uber Engineering's Highest Query per Second Service Using Go". Uber Engineering Blog. February 24, 2016. Retrieved March 2, 2016.
  148. ^ Simionato, Michele (November 15, 2009). "Interfaces vs Inheritance (or, watch out for Go!)". artima. Retrieved November 15, 2009.
  149. ^ Astels, Dave (November 9, 2009). "Ready, Set, Go!". engineyard. Retrieved November 9, 2009.
  150. ^ jt (January 11, 2010). "Google's Go Wins Programming Language Of The Year Award". jaxenter. Retrieved December 5, 2012.
  151. ^ "TIOBE Programming Community Index for June 2015". TIOBE Software. June 2015. Retrieved July 5, 2015.
  152. ^ Eckel, Bruce (August 27, 2011). "Calling Go from Python via JSON-RPC". Retrieved August 29, 2011.
  153. ^ Hundt, Robert (2011). Loop recognition in C++/Java/Go/Scala (PDF). Scala Days.
  154. ^ Metz, Cade (July 1, 2011). "Google Go strikes back with C++ bake-off". The Register.
  155. ^ Brownlee, John (November 13, 2009). "Google didn't google "Go" before naming their programming language'". Archived from the original on December 8, 2015. Retrieved May 26, 2016.
  156. ^ Claburn, Thomas (November 11, 2009). "Google 'Go' Name Brings Accusations Of Evil'". InformationWeek. Archived from the original on July 22, 2010. Retrieved January 18, 2010.
  157. ^ a b "Issue 9 - go — I have already used the name for *MY* programming language". Github. Google Inc. Retrieved October 12, 2010.
  158. ^ Yager, Will. "Why Go is not Good". Retrieved November 4, 2018.
  159. ^ Dobronszki, Janos. "Everyday Hassles in Go". Retrieved November 4, 2018.
  160. ^ "Why are there braces but no semicolons? And why can't I put the opening brace on the next line?". Retrieved March 26, 2020. The advantages of a single, programmatically mandated format for all Go programs greatly outweigh any perceived disadvantages of the particular style.
  161. ^ "I want off Mr. Golang's Wild Ride". February 28, 2020. Retrieved November 17, 2020.
  162. ^ "proposal: os: Create/Open/OpenFile() set FILE_SHARE_DELETE on windows #32088". GitHub. May 16, 2019. Retrieved November 17, 2020.
  163. ^ Tu, Tengfei (2019). "Understanding Real-World Concurrency Bugs in Go" (PDF). For example, around 58% of blocking bugs are caused by message passing. In addition to the violation of Go's channel usage rules (e.g., waiting on a channel that no one sends data to or close), many concurrency bugs are caused by the mixed usage of message passing and other new semantics and new libraries in Go, which can easily be overlooked but hard to detect{{cite web}}: CS1 maint :url-status (링크)

추가 정보

외부 링크