Go (프로그래밍 언어)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
Go는 2007년 구글에서 개발을 시작하여 2009년 오픈 소스로 출시된 프로그래밍 언어이다. C++의 복잡성을 개선하고, 정적 타입과 런타임 효율성, 가독성, 고성능 컴퓨터 네트워크 및 멀티프로세싱을 목표로 설계되었다. 2012년 첫 정식 버전인 1.0이 출시된 이후, 제네릭 프로그래밍을 지원하는 1.18 버전을 포함하여 꾸준한 업데이트를 통해 기능 개선 및 성능 향상이 이루어졌다. Go는 간결하고 효율적인 문법, 병행 컴퓨팅 지원, 패키지 시스템을 제공하며, 구글, 라이트닝 네트워크, 도커, 쿠버네티스 등 다양한 분야에서 활용된다. 초기에는 제네릭 프로그래밍 부재, 데이터 레이스 발생 가능성, 상속 및 예외 처리 부재 등으로 비판을 받았으나, 제네릭 지원 추가 및 지속적인 개선을 통해 발전하고 있다.
더 읽어볼만한 페이지
- 병행 프로그래밍 언어 - 자바 (프로그래밍 언어)
자바는 제임스 고슬링 등에 의해 개발된 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행 가능하며 샌드박스 모델 기반의 보안 기능, 자동 메모리 관리, 멀티스레딩 등을 지원한다. - 병행 프로그래밍 언어 - 스칼라 (프로그래밍 언어)
스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다. - 시스템 프로그래밍 언어 - C (프로그래밍 언어)
C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다. - 시스템 프로그래밍 언어 - 스위프트 (프로그래밍 언어)
2014년 애플 세계 개발자 컨퍼런스에서 처음 공개된 스위프트는 크리스 래트너가 개발한 애플의 범용 프로그래밍 언어로서, Objective-C를 대체하며 다양한 플랫폼 지원, 모던 문법, 안정성, 인터랙티브한 개발 환경, SwiftUI 등의 특징을 가진다.
Go (프로그래밍 언어) - [IT 관련 정보]에 관한 문서 | |
---|---|
개요 | |
![]() | |
설명 | 프로그래밍 언어 |
일반 정보 | |
패러다임 | 멀티 패러다임: 병행, 명령형, 함수형, 객체 지향 |
설계자 | 로버트 그리즈머 롭 파이크 켄 톰프슨 |
개발자 | Go Authors |
최신 릴리스 날짜 | }} |
타이핑 | 추론, 정적, 강한, 구조적, 명목적 |
메모리 관리 | 가비지 컬렉션 |
구현체 | gc, gofrontend |
프로그래밍 언어 | Go, 어셈블리어 (gc); C++ (gofrontend) |
영향을 준 언어 | Crystal, V |
운영체제 | DragonFly BSD FreeBSD 리눅스 macOS NetBSD OpenBSD Plan 9 Solaris Windows |
라이선스 | 3-clause BSD + 특허 허가 |
파일 확장자 | .go |
2. 역사
Go는 2007년 9월 21일 구글에서 로버트 그리즈머, 롭 파이크, 켄 톰프슨이 인페르노 분산 운영체제 관련 작업을 하다가 시작되었다.[201] 이들은 C++의 복잡성에 대한 불만을 공유하며 새로운 언어 개발에 착수했다.[204][205][206] Go는 다른 언어의 긍정적인 특징들을 유지하면서 공통이 되는 문제들을 해결할 새로운 프로그래밍 언어를 설계하기 위해 실험적으로 시작되었다.
새로운 언어는 다음의 기능을 포함하도록 설계되었다:[176]
- 자바나 C++처럼, 정적으로 형이 지정되고, 거대한 시스템에서도 확장된다.
- 루비나 파이썬 등의 동적인 언어처럼 생산성이 높고, 가독성이 좋으며, 과도한 보일러플레이트가 필요하지 않다.[177]
- IDE가 필수적이지 않다. 단, 충분히 지원한다.
- 네트워크 및 멀티 프로세싱을 지원한다.
2008년 1월, 켄 톰프슨이 C 코드를 만들어내는 컴파일러를 만들기 시작했고, 2008년 중반에는 풀타임 프로젝트로 승격되었다. 2008년 5월에는 이안 테일러가 Go 스펙의 초안을 이용해서 GCC 프론트엔드를 만들기 시작했고, 2008년 말에는 러스 콕스가 참여하면서 프로토타입에서 실질적인 언어와 라이브러리들을 만들기 시작했다.[201]
2009년 11월 10일, Go는 리눅스와 macOS 플랫폼을 대상으로 공식 발표되었다.[170] 2010년 5월, 롭 파이크는 구글에서 실제로 사용되고 있는 부분이 있다고 공개적으로 알렸다.[201] 2012년 3월 28일, 버전 1.0이 출시되었다.[171] Go는 구글[32] 및 다른 많은 조직과 오픈 소스 프로젝트에서 널리 사용되고 있다.
Go는 '''Golang'''이나 '''Go 언어'''로 표기되기도 하지만, 언어의 정식 명칭은 '''Go'''이다.[169] golang이라는 통칭은 공식 사이트의 도메인인 ''golang.org''에서 유래되었는데, 이는 ''go.org''를 획득할 수 없었기 때문이다.[169]

2018년 4월, 구 로고 (Gopher 마스코트)가 텍스트와 3개의 직선으로 이루어진 새로운 디자인으로 변경되었다. 그러나 마스코트는 그대로 변하지 않았다.
2. 1. 버전
Go는 안정적인 릴리스 정책을 유지하며, 각 주요 릴리스는 두 개의 최신 주요 릴리스가 나올 때까지 지원된다.[48] Go 1.0(2012년 3월) 이후 현재(2023년)까지 모든 버전이 호환성을 유지하고 있다.[46][47]릴리스 | 상태 | 출시일 | 유지보수 종료일 |
---|---|---|---|
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 |
go1.5 | 지원 종료 | 2015-08-19 | 2016-08-15 |
go1.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 |
go1.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-08-02 |
go1.18 | 지원 종료 | 2022-03-15 | 2023-02-01 |
go1.19 | 유지보수 | 2022-08-02 | 2023년 3분기 |
go1.20 | 현재 | 2023-02-01 | 2024년 1분기 |
go1.21 | 계획 | 2023년 3분기 | 2024년 3분기 |
Go는 C와 유사한 구조를 가지면서도 간결하고 효율적인 문법을 지향한다. 불필요한 요소를 제거하여 가독성을 높였으며, 타입 추론, 가비지 컬렉션, 강력한 표준 라이브러리 등을 통해 개발 생산성을 향상시킨다.
2009년 11월 10일에 Go가 처음 발표되었으며[170], 버전 1.0은 2012년 3월 28일에 출시되었다.[171]
2017년 7월 13일, 버전 2로의 작업 시작이 발표되었다.[181] 버전 1.x 계열과 버전 2의 개발은 병행되며, 버전 1.20이 버전 2와 동의어가 될 것이라고 선언되었다.
2021년 8월 16일, 버전 1.17이 출시되었다. 64비트 ARM 아키텍처용 Windows가 지원된다.[182] 버전 2 계열은 Nightly Build 계열이며, 공식적으로는 출시되지 않았다. 이는 프로그램 아키텍처의 변경이 사용자에게 막대한 부담을 주는 것을 고려했기 때문이다 (Rust로부터의 반성).
3. 특징
주요 특징은 다음과 같다:3. 1. 문법
Go는 C 계열 언어의 문법을 따르지만, 몇 가지 차이점이 있다. 코드 블록은 중괄호로 묶고, `for`, `switch`, `if`와 같은 일반적인 제어 구조를 가지고 있다. C와 달리, 한 라인 끝의 세미콜론은 필수가 아닌 선택 사항이다.[50]
변수 선언은 다르게 작성되며, 대부분 선택적이다. 형 변환은 명시적으로 해야 한다. 병행 컴퓨팅을 위해 'go'와 'select' 키워드가 사용된다. 새로운 타입으로는 map, 유니코드 문자열, 배열 slice, 그리고 내부 쓰레드 통신을 위한 채널(channel)이 있다.[50]
Go는 C (특히 벨 연구소의 플랜 9 방언)의 영향을 받았지만,[50] 더 단순하고 안전함을 강조한다. Go는 다음과 같은 특징을 가진다.
Go의 문법은 코드를 간결하고 읽기 쉽게 유지하기 위해 C에서 변경되었다. `i := 3` 또는 `s := "Hello, world!"`와 같이 변수의 타입을 지정하지 않고 작성할 수 있도록 선언/초기화 연산자가 도입되었다. 이는 C의 `int i = 3;` 및 `const char *s = "Hello, world!";`와 대조된다.
세미콜론은 여전히 문장을 종결하지만, 줄의 끝이 발생할 때 암묵적으로 사용된다.
메서드는 여러 값을 반환할 수 있으며, `result, err` 쌍을 반환하는 것은 Go에서 메서드가 호출자에게 오류를 나타내는 일반적인 방식이다. Go는 이름으로 구조체 매개변수를 초기화하고 맵과 슬라이스를 초기화하기 위한 리터럴 구문을 추가한다. C의 세 문장 `for` 루프 대신, Go의 `range` 표현식은 배열, 슬라이스, 문자열, 맵 및 채널에 대한 간결한 반복을 허용한다.[58]
`fmt.Println("Hello World!")`는 문장이다.
Go에서 문장은 줄을 끝내거나(Enter 키 누름) 세미콜론("`;`")으로 구분된다. Enter 키를 누르면 줄의 끝에 암묵적으로 "`;`"가 추가된다(소스 코드에는 표시되지 않음).
왼쪽 중괄호 `{`는 줄의 시작 부분에 올 수 없다.[59]
구문은 다양한 언어와 부분적으로 유사하다. 변수 등의 타입 표기는 림보에서 계승된 것으로 생각되며, 타입명을 후치하는 것으로, 파스칼이나 에이다와 유사하다. 블록의 구분에 중괄호를 사용하는 표기는 C 언어 외 다수와 동일하다. for 문이나 if 문에서는 조건식을 괄호로 묶지 않고, 귀결 부분에는 중괄호가 필수이다. 상수 생성기 iota는 ASP에서 유래되었다. 그 외에, 병렬 처리에 대해, CSP를 참고하고 있으며,[184] '''채널'''에 의한 스레드 간 통신 기능의 구문이 있다.
3. 2. 타입 시스템
Go는 정적 타입 언어이며, 명시적인 형 변환을 요구한다.[68] 기본 타입(숫자, 문자열, 불린 등) 외에도 구조체, 배열, 슬라이스, 맵, 채널 등 다양한 타입을 지원한다. 인터페이스를 통해 객체 지향 프로그래밍의 다형성을 구현하며, 덕 타이핑과 유사한 구조적 타이핑을 지원한다.
Go는 숫자형( `byte`, `int64`, `float32` 등), 부울형, 바이트 문자열(`string`)을 포함한 여러 내장 형식을 가지고 있다. 문자열은 변경 불가능하다; 내장 연산자와 키워드(함수가 아닌)는 연결, 비교 및 UTF-8 인코딩/디코딩을 제공한다.[60] 레코드 형식은 `struct` 키워드로 정의할 수 있다.[61]
각 형식 `T`와 각 음이 아닌 정수 상수 `n`에 대해, `['n']T`로 표시되는 배열 형식이 있다. 서로 다른 길이의 배열은 따라서 서로 다른 형식이다. 동적 배열은 형식 `T`에 대해 `[]T`로 표시되는 "슬라이스"로 사용할 수 있다. 이들은 배열을 확장하기 위해 새 메모리를 할당해야 하는 시점을 지정하는 길이와 "용량"을 갖는다. 여러 슬라이스가 기본 메모리를 공유할 수 있다.[62][63]
포인터는 모든 형식에 사용할 수 있으며, 포인터-`T` 형식은 `*T`로 표시된다. 주소 취득 및 간접 참조는 C와 마찬가지로 `&` 및 `*` 연산자를 사용하거나, 메서드 호출 또는 속성 접근 구문을 통해 암시적으로 발생한다.[64][65] 표준 라이브러리의 특수 `unsafe.Pointer` 형식을 제외하고는 포인터 산술 연산이 없다.[66]
두 형식 `K`, `V`에 대해, 형식 `map['K']V`는 형식-`K` 키를 형식-`V` 값에 매핑하는 형식이다. Go 프로그래밍 언어 사양은 맵 형식에 대한 성능 보장이나 구현 요구 사항을 제공하지 않는다. 해시 테이블은 특수 구문과 내장 함수를 사용하여 언어에 내장되어 있다. `chan T`는 동시 Go 프로세스 간에 형식 ''T''의 값을 전송할 수 있는 "채널"이다.[67]
인터페이스 지원 외에도 Go의 형식 시스템은 명목적이다: `type` 키워드는 동일한 레이아웃(`struct`의 경우 동일한 멤버가 동일한 순서로)을 가진 다른 명명된 형식과 구별되는 새로운 "명명된 형식"을 정의하는 데 사용할 수 있다. 형식 간의 일부 변환(예: 다양한 정수 형식 간)은 미리 정의되어 있으며 새 형식을 추가하면 추가 변환을 정의할 수 있지만, 명명된 형식 간의 변환은 항상 명시적으로 호출해야 한다.[68] 예를 들어, `type` 키워드는 다음과 같이 32비트 부호 없는 정수를 기반으로 하는 IPv4 주소에 대한 형식을 정의하는 데 사용할 수 있다.
type ipv4addr uint32
이 형식 정의를 사용하면 `ipv4addr(x)`는 `uint32` 값 `x`를 IP 주소로 해석한다. `x`를 형식 `ipv4addr`의 변수에 단순히 할당하는 것은 형식 오류이다.[69]
''상수 표현식''은 형식화되거나 "형식화되지 않은" 상태일 수 있으며, 나타내는 값이 컴파일 시간 검사를 통과하면 형식화된 변수에 할당될 때 형식이 지정된다.[70]
''함수 형식''은 `func` 키워드로 표시된다. 0개 이상의 매개변수를 받고 0개 이상의 값을 반환하며, 이 모든 값은 형식화된다. 매개변수와 반환 값은 함수 형식을 결정한다. 따라서 `func(string, int32) (int, error)`는 `string`과 32비트 부호 있는 정수를 받아서 부호 있는 정수(기본 너비)와 내장 인터페이스 형식 `error`의 값을 반환하는 함수의 형식이다.[71]
모든 명명된 형식에는 관련된 메서드 세트가 있다. 위의 IP 주소 예제는 해당 값이 알려진 표준인지 확인하기 위한 메서드로 확장할 수 있다.
// ZeroBroadcast는 addr이 255.255.255.255인지 보고합니다.
func (addr ipv4addr) ZeroBroadcast() bool {
return addr == 0xFFFFFFFF
}
명목 형식 지정으로 인해, 이 메서드 정의는 `ipv4addr`에 메서드를 추가하지만 `uint32`에는 추가하지 않는다. 메서드는 특수한 정의 및 호출 구문을 가지고 있지만, 별도의 메서드 형식은 없다.[72]
Go는 클래스 상속을 대체하는 두 가지 기능을 제공한다.
첫 번째는 ''임베딩''으로, 합성의 자동화된 형태로 볼 수 있다.
두 번째는 ''인터페이스''로, 런타임 다형성을 제공한다.[73] 인터페이스는 클래스의 일종이며, Go의 명목적 타입 시스템에서 제한적인 형태의 구조적 타이핑을 제공한다. 인터페이스 타입의 객체는 기본 클래스와 파생 클래스를 동시에 갖는 C++ 객체와 마찬가지로 다른 타입이기도 하다. Go 인터페이스의 설계는 Smalltalk 프로그래밍 언어의 프로토콜에서 영감을 받았다.[74] 여러 소스에서 Go 인터페이스를 설명할 때 덕 타이핑이라는 용어를 사용한다.[75][76] 덕 타이핑이라는 용어는 정확하게 정의되지 않아 틀린 것은 아니지만, 일반적으로 타입 준수가 정적으로 확인되지 않음을 의미한다. Go 인터페이스 준수는 Go 컴파일러에 의해 정적으로 확인되므로(타입 단언을 수행하는 경우 제외), Go 개발자는 ''구조적 타이핑''이라는 용어를 선호한다.[77]
인터페이스 타입의 정의는 이름과 타입별로 필요한 메서드를 나열한다. 인터페이스 타입 I의 모든 필수 메서드와 일치하는 함수가 있는 타입 T의 모든 객체는 I 타입의 객체이기도 하다. 타입 T의 정의는 I 타입을 식별할 필요가 없으며 (할 수도 없습니다). 예를 들어, `Shape`, `Square` 및 `Circle`이 다음과 같이 정의된 경우
import "math"
type Shape interface {
Area() float64
}
type Square struct { // Note: no "implements" declaration
side float64
}
func (sq Square) Area() float64 { return sq.side * sq.side }
type Circle struct { // No "implements" declaration here either
radius float64
}
func (c Circle) Area() float64 { return math.Pi * math.Pow(c.radius, 2) }
`Square`와 `Circle` 모두 암시적으로 `Shape`이며, `Shape` 타입 변수에 할당될 수 있다. 공식 언어에서 Go의 인터페이스 시스템은 명목적 타이핑이 아닌 구조적 타이핑을 제공한다. 인터페이스는 포함된 인터페이스를 구현하는 정확한 타입과 새로 정의된 인터페이스가 추가하는 모든 메서드에 의해 충족되는 결합된 인터페이스를 생성하는 효과로 다른 인터페이스를 포함할 수 있다.
Go 표준 라이브러리는 `Reader` 및 `Writer`의 개념을 기반으로 하는 입/출력 시스템을 포함하여 여러 곳에서 인터페이스를 사용하여 제네릭을 제공한다.
Go는 인터페이스를 통해 메서드를 호출하는 것 외에도 런타임 타입 검사를 통해 인터페이스 값을 다른 타입으로 변환할 수 있다. 이를 위한 언어 구성은 단일 잠재 타입에 대해 검사하는 ''타입 단언''[78] 및 여러 타입을 검사하는 ''타입 스위치''이다.
var shp Shape = Square{5}
square, ok := shp.(Square) // Asserts Square type on shp, should work
if ok {
fmt.Printf("%#v\n", square)
} else {
fmt.Println("Can't print shape as Square")
}
func (sq Square) Diagonal() float64 { return sq.side * math.Sqrt2 }
func (c Circle) Diameter() float64 { return 2 * c.radius }
func LongestContainedLine(shp Shape) float64 {
switch v := shp.(type) {
case Square:
return v.Diagonal() // Or, with type assertion, shp.(Square).Diagonal()
case Circle:
return v.Diameter() // Or, with type assertion, shp.(Circle).Diameter()
default:
return 0 // In practice, this should be handled with errors
}
}
''빈 인터페이스'' `interface{}`는 ''모든'' 구체적인 타입의 항목을 참조할 수 있기 때문에 중요한 기본 사례이다. 이는 Java 또는 C#의 `Object` 클래스와 유사하며, `int`와 같은 내장 타입을 포함한 모든 타입에 의해 충족된다. 빈 인터페이스를 사용하는 코드는 참조된 객체에서 단순히 메서드(또는 내장 연산자)를 호출할 수 없지만, `interface{}` 값을 저장하거나, 타입 단언 또는 타입 스위치를 통해 더 유용한 타입으로 변환을 시도하거나, Go의 `reflect` 패키지로 검사할 수 있다.[80] `interface{}`는 모든 값을 참조할 수 있으므로 C의 `void*`와 같이 정적 타이핑의 제약을 벗어나는 제한된 방법이지만, 추가적인 런타임 타입 검사가 있다.
`interface{}` 타입은 JSON 또는 YAML 데이터와 같이 임의의 스키마의 구조화된 데이터를 Go에서 `map[string]interface{}`(문자열에서 빈 인터페이스로의 맵)로 표현하여 모델링하는 데 사용할 수 있다. 이는 문자열 키와 모든 타입의 값으로 이루어진 사전 형태의 데이터를 재귀적으로 설명한다.[81]
인터페이스 값은 데이터에 대한 포인터와 런타임 타입 정보에 대한 두 번째 포인터를 사용하여 구현된다.[82] Go에서 포인터를 사용하여 구현된 다른 타입과 마찬가지로, 인터페이스 값은 초기화되지 않은 경우 `nil`이다.[83]
1. 18 버전부터 Go는 매개변수화된 타입을 사용하는 제네릭 코드를 지원한다.[84]
함수와 타입은 이제 타입 매개변수를 사용하여 제네릭할 수 있는 기능을 갖게 되었다. 이러한 타입 매개변수는 함수 또는 타입 이름 바로 뒤에 대괄호 안에 지정된다.[85] 컴파일러는 사용자가 명시적으로 제공하거나 컴파일러의 타입 추론을 통해 제공된 타입 매개변수에 대해 ''타입 인수''를 대체하여 제네릭 함수 또는 타입을 제네릭하지 않은 타입으로 변환한다.[86] 이 변환 프로세스를 타입 인스턴스화라고 한다.[87]
인터페이스는 이제 `|` (Union) 연산자를 사용하여 타입 집합(타입 세트라고 함)과 메서드 집합을 정의할 수 있다. 이러한 변경 사항은 제네릭 코드에서 타입 제약 조건을 지원하기 위해 이루어졌다. 제네릭 함수 또는 타입의 경우 제약 조건은 타입 인수의 타입, 즉 메타 타입으로 간주될 수 있다. 이 새로운 `~T` 구문은 Go에서 토큰으로 `~`를 처음 사용하는 것이다. `~T`는 기본 타입이 `T`인 모든 타입의 집합을 의미한다.[88]
type Number interface {
~int | ~float64 | ~float32 | ~int32 | ~int64
}
func Add[T Number](nums ...T) T {
var sum T
for _, v := range nums {
sum += v
}
return sum
}
func main() {
add := Add[int] // 타입 인스턴스화
println(add(1, 2, 3, 4, 5)) // 15
res := Add(1.1, 2.2, 3.3, 4.4, 5.5) // 타입 추론
println(res) // +1.650000e+001
}
Go는 사용자가 정의할 수 있는 복합형을 기술할 수 있는 구조체 기능을 가지고 있으며, 다음과 같이 기술한다.
package main
import "fmt"
// 새로운 구조체형의 정의. 각 필드의 식별자와 그 타입명을 지정.
type Person struct {
name string // 이름.
age int // 나이.
}
// 메서드의 정의.
func (m *Person) PrintName() {
fmt.Printf("Name = %s\n", m.name)
//fmt.Printf("Name (%T) = %#v\n", m.name, m.name)
}
func (m *Person) PrintAge() {
fmt.Printf("Age = %d\n", m.age)
//fmt.Printf("Age (%T) = %#v\n", m.age, m.age)
}
func main() {
var person Person
person.name = "John Smith"
person.age = 24
// 다음과 같이 쓸 수도 있다.
//person := Person{ "John Smith", 24 }
person.PrintName()
person.PrintAge()
// 다음과 같이 형식 지정하면, 타입명과 리터럴 표현을 출력할 수 있다.
fmt.Printf("person (%T) = %#v\n", person, person)
}
위의 예에서는 `name` 및 `age`라는 필드를 가진 `Person` 구조체의 타입을 정의하고, 더 나아가 그 구조체에 대응하는 `PrintName()` 및 `PrintAge()`라는 메서드를 정의하고 있다. Go에는 Java와 같은 언어가 가진 클래스나 객체와 같은 개념은 없지만, 실질적으로 구조체는 그것들과 비슷한 역할을 제공한다.
Go에서는 함수에 `(m *Person)`과 같은 리시버 선언을 추가하여 메서드를 정의한다. 리시버의 선언은 `(변수명 타입명)`으로 기술한다. 리시버 내의 변수명은 자유롭게 지정이 가능하며, 받는 방법은 값 전달, 포인터 전달의 2종류에서 지정할 수 있다.
타입과 메서드가 분리되어 있으며, 타입은 일절 메서드에 의존하지 않는다. 메서드와 타입은, 메서드의 추가 대상이 되는 타입명을 리시버의 타입명으로 지정함으로써 관련지어지도록 되어 있다. 메서드는 타입으로부터 분리되어 있기 때문에 타입 본체를 변경하지 않고 메서드를 추가하는 것이 가능하며, 동일 패키지 내 한정으로, 개방된 타입을 실현하고 있다.
Go에는 타입 자체를 초기화하거나 종료하거나 하는 기능이 존재하지 않는다. 즉 Java의 정적 이니셜라이저나 C#의 정적 생성자에 해당하는 기능이 없다. 초기화는 타입에 속하지 않는 함수나, 다른 타입의 메서드로 행해지도록 되어 있다.
Go에서는 `type` 구문을 사용하여 기존 형에서 새로운 형을 정의할 수 있다.
다음 예제에서는, `int`형을 기반으로 `MathInt`라는 새로운 형을 정의하고 있다.
```go
type MathInt int
```
이는 C/C++의 typedef나 C#의 using 별칭 지시어와 달리, 단순히 기존 형에 별칭을 부여하는 것이 아니라, 원래의 `int`형과는 다른 형을 정의한다는 점에서 크게 다르다.
새롭게 정의된 형이라면, 원래 형이 구조체 형이 아니더라도 메서드를 추가할 수 있다. 예를 들어 `int`형이나 맵형과 같은 사전 정의된 형(내장형)에 대해서도 메서드를 추가하는 것이 가능하다.
사전 정의된 형에서 새로운 형을 정의한 경우, 예를 들어 다음과 같은 기술이 가능하다.
```go
package main
import (
"fmt"
"math"
)
type MathInt int
func (x MathInt) Abs() float64 {
return math.Abs(float64(x))
}
func main() {
var x MathInt = -10
fmt.Printf("%d\n", x) // -> -10
fmt.Printf("%f\n", x.Abs()) // -> 10.000000
fmt.Printf("%T\n", x) // -> main.MathInt
}
```
Go 1.9에서는 type 키워드를 사용한 형 별칭(type alias) 구문이 별도로 추가되었다.[185] 이것은 C/C++의 typedef나 C#의 using 별칭 지시어와 유사한 기능이다.
```go
package main
import (
"fmt"
"math"
)
type MyInt = int
func main() {
var x MyInt = -10
fmt.Printf("%d\n", x) // -> -10
fmt.Printf("%f\n", math.Abs(float64(x))) // -> 10.000000
fmt.Printf("%T\n", x) // -> int
}
```
Go는 의도적으로 상속을 구현하지 않았다. 하지만 익명 필드 기능을 사용하면 특정 구조체와 동일한 필드와 메서드를 가진 구조체를 쉽게 만들 수 있다.
```go
type Base int
func (_ *Base) Function() {
}
type Derived struct {
Base
}
// 호출 예시
var derived Derived
derived.Function()
```
이렇게 만들어진 구조체에서 익명 필드로 사용된 원래 구조체 타입으로 암묵적으로 형변환하는 기능은 존재하지 않는다.
Go에는 C++나 다른 언어의 가상 함수를 가진 클래스가 존재하지 않는다. 타입에 추가된 메서드는 일종의 비가상 함수이다. Go에서 다형성은 interface 타입을 사용하여 구현한다.
interface 타입은 구현을 전혀 가지지 않고 메서드의 형식만 정의한 타입이며, 이는 C# 등 최근 언어의 interface와 같다. 단, Go의 interface 타입은 대입할 수 있는 타입과의 연관 관계가 필요 없다. interface에 정의된 메서드를 모두 가지고 있다면 어떤 객체라도 대입 가능하다.
Go의 interface 예시를 아래에 나타낸다.
```go
type Container interface {
Begin() Iterator
End() Iterator
}
```
Go의 interface는 ML의 signature나, 과거 g++에 존재했던 signature라는 C++ 확장과 완전히 동일한 기능이다.
Go는 인터페이스형 값에서 기본형 값(인터페이스형으로 변환되기 전의 형의 값)을 동적으로 안전하게 얻는 다운캐스트 메커니즘으로 "타입 어서션"이라고 불리는 기능을 갖추고 있다.
// Value의 반환값은 어떤 형이든 상관없다.
var i interface{} = Value()
/*
i의 기본형을 string이라고 가정하고,
실제로 그렇다면 s에는 변환 결과가, ok에는 true가 설정되고,
그렇지 않으면 s에는 string형의 초기값(제로값)이, ok에는 false가 설정된다.
다음과 같이 두 번째 반환값을 무시하면 i의 기본형이 string이 아니면 암묵적으로 런타임 패닉이 발생한다.
s := i.(string)
if s, ok := i.(string); ok {
fmt.Println ("문자열: ", s)
} else {
var kind string
// 타입 switch
switch i.(type) {
case int:
kind = "수치"
default:
kind = "기타"
}
fmt.Printf ("%s: %v\n", kind, i)
}
표준 패키지인 reflect를 사용하면[186], 대상 값의 형이나 그 값 등의 상세 정보를 얻을 수 있다.
3. 3. 동시성
Go는 고루틴(goroutine)과 채널(channel)을 통해 동시성 프로그래밍을 지원한다.
고루틴은 경량 프로세스 (그린 스레드의 일종)이다.[93] `go` 키워드를 사용하여 함수를 호출하면 새로운 고루틴에서 해당 함수가 실행된다. 고루틴은 Go 프로세스의 고루틴을 더 적은 수의 운영 체제 스레드에 다중화하여 Erlang에서 수행되는 스케줄링과 유사하게 작동한다.
채널은 고루틴 간의 메시지 전달을 위한 통로이다.[94] 선택적 버퍼는 FIFO 순서로 메시지를 저장하며[95] 메시지가 수신되기 전에 보낸 고루틴이 계속 진행되도록 허용한다.[93] 채널은 형식이 지정되어 있어 `chan T` 형식의 채널은 `T` 형식의 메시지만 전송할 수 있다. `<-ch`는 채널 `ch`을 통해 값이 들어올 때까지 실행 중인 고루틴을 차단하고, `ch <- x`는 값 `x`를 보낸다(다른 고루틴이 값을 수신할 때까지 차단될 수 있음). 내장된 `switch`-like `select` 문은 여러 채널에서 비차단 통신을 구현하는 데 사용된다.
Go는 고루틴이 채널 또는 기타 연산을 사용하여 데이터를 안전하게 공유해야 하는 방식을 설명하는 메모리 모델이 있다.[96]
Go의 동시성 관련 구조적 규칙(채널 및 대체 채널 입력)은 토니 호어의 통신 순차 프로세스 모델에서 파생되었다. Occam 또는 Limbo와 달리,[101] Go는 안전하거나 검증 가능한 동시성에 대한 내장 개념을 제공하지 않는다.[102]
다음은 Go의 동시성 기능을 보여주는 간단한 프로그램 예시이다.
package main
import (
"fmt"
"time"
)
func readword(ch chan string) {
fmt.Println("단어를 입력하고 Enter 키를 누르세요.")
var word string
fmt.Scanf("%s", &word)
ch <- word
}
func timeout(t chan bool) {
time.Sleep(5 * time.Second)
t <- false
}
func main() {
t := make(chan bool)
go timeout(t)
ch := make(chan string)
go readword(ch)
select {
case word := <-ch:
fmt.Println("수신됨", word)
case <-t:
fmt.Println("시간 초과.")
}
}
위 프로그램은 두 개의 고루틴을 실행한다. 하나는 사용자가 텍스트를 입력할 때까지 기다리고, 다른 하나는 시간 초과를 구현한다. `select` 문은 이 고루틴 중 하나가 메인 루틴으로 메시지를 보낼 때까지 기다리고, 먼저 도착한 메시지에 따라 작동한다.[131]
3. 4. 패키지 시스템
Go는 모듈화를 위한 패키지 시스템을 제공하며, 각 패키지는 고유한 경로(예: `"compress/bzip2"` 또는 `"golang.org/x/net/html"`)와 이름(예: `bzip2` 또는 `html`)을 가진다.[89] 다른 패키지의 정의를 참조할 때는 항상 해당 패키지의 이름을 사용해야 하며, 대문자로 시작하는 이름만 외부에서 접근할 수 있다. 예를 들어, `io.Reader`는 공개적으로 접근 가능하지만, `bzip2.reader`는 그렇지 않다.[89]
`go get` 명령어를 사용하면 원격 저장소에 있는 패키지를 다운로드하여 설치할 수 있다.[90] 패키지 이름 충돌 가능성을 줄이기 위해, 개발자는 소스 저장소의 기본 경로(예: `example.com/user_name/package_name`) 내에서 패키지를 개발하는 것이 좋다.[91]
Go는 이름과 모듈 관리를 위해 '패키지' 메커니즘을 사용한다. Go에는 다양한 `import`문이 있지만, 구성 요소는 별칭 지정과 Go 소스를 저장한 폴더(또는 패키지 바이너리) 지정으로 단순하다. Go는 이름 관리와 모듈 가져오기 지정을 하나의 구문으로 통합하여 모듈 결합을 간결하게 처리한다.
기본적인 패키지 사용 예시는 다음과 같다.
```go
package main // 현재 소스 파일이 속한 패키지 이름 지정
// 본 기사의 예에서는 생략되는 경우가 많지만 원래는 필수이다.
import _ "./sub/a" // (1) 소스 파일에서 이름이 사용되지 않는 패키지 가져오기
import . "./sub/b" // (2) 패키지 이름을 생략하고 패키지 내 이름을 현재 소스 파일로 모두 가져오기
import alias_c "./sub/c" // (3) 패키지 이름에 별칭을 지정하여 패키지 이름을 현재 소스 파일로 가져오기
import "./sub/d" // (4) 패키지 이름에 끝 패키지 이름과 동일한 이름을 지정하여 현재 소스 파일로 가져오기
func main() {
Function() // (2)의 패키지에 속한 Function 호출
alias_c.Function() // (3)의 패키지에 속한 Function 호출
d.Function() // (4)의 패키지에 속한 Function 호출
}
```
Go는 이름 해결 방법으로 계층형 네임스페이스 대신 별칭 방식(만)을 채택하여, 긴 이름(완전 정규화 이름)을 작성하는 번거로움이 없다.
Go는 소스 파일 내에 초기화 함수(`init`)를 정의하여 광역 변수를 초기화할 수 있다. 이 초기화 함수는 `main` 함수가 정의된 소스 파일에서 연쇄적으로 `import`된 패키지에 포함된 소스 파일에서만 호출된다. 따라서 사용하지 않는 초기화 코드가 실행될 우려가 없고, 패키지가 처음 참조될 때까지 초기화가 지연되지도 않는다.
4. 구현체
Go는 주로 두 가지 구현체를 가지고 있다.
- 구글의 Go 툴체인: 리눅스, BSD, macOS, 플랜 9, 윈도우, (2015년 이후) 모바일 장치를 포함한 여러 플랫폼을 대상으로 한다.[208] 주요 Go 컴파일러는 버전 1.5에 셀프 호스팅되었다.[209]
- gccgo: GCC 프론트엔드이다.[210][211]
GopherJS라는 이름의 서드파티 Go 컴파일러도 존재한다.[212] GopherJS는 Go 코드를 자바스크립트 코드로 컴파일하며 Go가 프론트엔드 개발에 사용될 수 있게 한다.
Go 언어의 처리계는 2 종류가 있다.[187]
- `gc`는 Go 언어로 구현된 셀프 호스팅 Go 언어 컴파일러이다. 버전 1.4 이전에는 C 언어로 구현되었지만, 버전 1.5에서 C 언어에서 Go 언어로의 변환 도구를 사용하여 컴파일러의 구현 언어를 전환하여, 이후에는 Go 언어로 개발하고 있다. 구문 분석에 yacc・bison을 사용하고 있다.
- `Gccgo`는 재귀 하강 파서를 갖춘 C++ 프런트 엔드, 백엔드에 표준 GCC를 이용한 서드파티 개발의 Go 언어 컴파일러이다.
5. 언어 도구
Go는 개발 생산성을 높이기 위한 다양한 도구를 제공한다. Go 배포판에는 다음과 같은 도구들이 포함되어 있다.
- `go build`: 소스 파일 자체의 정보만을 사용하여 Go 바이너리를 빌드한다. 별도의 makefile은 없다.
- `go test`: 유닛 테스트 및 마이크로벤치마크.
- `go fmt`: 코드 서식 지정.
- `go get`: 원격 패키지의 검색 및 설치.
- `go vet`: 코드 내의 잠재적인 오류를 찾아내는 정적 분석기.
- `go run`: 코드를 빌드하고 실행하는 바로 가기.
- `godoc`: 문서를 표시. HTTP를 통해 문서 확인.
- `gorename`: 변수, 함수 등을 형 안전(type-safe) 방식으로 이름 변경.
- `go generate`: 코드 생성기를 호출하는 표준 방식.
이 외에도 프로파일링 및 디버깅 지원, 런타임 인스트루먼테이션(예: 가비지 컬렉션 일시 정지 등), 레이스 컨디션 테스터(race condition tester)도 포함한다.
6. 활용
Go는 다양한 분야에서 활용되고 있으며, 특히 다음과 같은 오픈 소스 프로젝트에서 널리 사용된다.
- 라이트닝 네트워크: 비트코인 네트워크
- CockroachDB: SQL 데이터베이스
- 도커: 리눅스 컨테이너를 배치시키는 도구들의 집합
- Doozer: 매니지드 호스팅 제공자 헤로쿠의 락 서비스
- Geth 소프트웨어: 이더리움 프로토콜 블록체인 기술을 이용한 golang 구현체로서, 전 세계 공유 컴퓨팅 플랫폼을 구현한다.[217]
- Gogs: 셀프 호스팅 Git 서비스.[218]
- InfluxDB: 고가용성과 고성능 요구사항을 필요로 하는 오픈 소스 데이터베이스
- Juju: 캐노니컬이 주관하는 서비스 오케스트레이션 도구 (우분투 리눅스의 패키저)
- 쿠버네티스 컨테이너 관리 소프트웨어
- 오픈시프트: 클라우드 컴퓨팅 플랫폼 (레드햇이 서비스함)
- 패커(Packer): 여러 플랫폼을 대상으로 하나의 소스 구성을 통해 동일한 머신 이미지를 만드는 도구
- 스내피: 우분투 터치용 패키지 관리자 (캐노니컬 제작)
- Syncthing: 오픈 소스 파일 동기화 클라이언트/서버 애플리케이션
- GitLab-runner: 오픈 소스 CI/CD 애플리케이션
- 이더리움 (geth)
Go를 사용한 일부 저명한 오픈 소스 소프트웨어 프레임워크는 다음과 같다.
- Beego: 고성능 웹 프레임워크
- Martini: 웹 애플리케이션/서비스용 패키지
- 고릴라: Go용 웹 툴킷
- Enduro/X ASG: 클러스터 미들웨어, 애플리케이션 서버, 분산 트랜잭션, 멀티 프로세싱 프레임워크
Go를 사용하는 저명한 기업 및 사이트는 다음과 같다(일반적으로 다른 언어와 함께 사용).[219][220]
- AeroFS: 프라이빗 클라우드 파일싱크 어플라이언트 제공자[221]
- Chango: Go를 사용하는 프로그래머틱 광고 회사[222]
- 클라우드 파운드리: PaaS
- Cloudflare[223][224]
- CoreOS: 도커 컨테이너를 활용하는 리눅스 기반 운영 체제[225]
- 카우치베이스 서버: 쿼리 및 인덱싱 서비스 (Couchbase 서버 내)[226]
- 드롭박스: 일부 중요한 구성 요소들을 파이썬에서 Go로 이관함[227]
- 구글: download server dl.google.com 등 수많은 프로젝트[228][229][230]
- MercadoLibre: 여러 퍼블릭 API
- 몽고DB: MongoDB 인스턴스 관리 도구[231]
- 넷플릭스: 서버 아키텍처의 두 부분[232]
- 노바티스: 내부 인벤토리 시스템용[233]
- Plug.dj: 상호작용 온라인 소셜 뮤직 스트리밍 웹사이트[234]
- Replicated: 도커 기반 PaaS (기업의 설치 가능 소프트웨어 제작용)[235]
- SendGrid[236]
- 사운드클라우드: 수십 개의 시스템용[237]
- Splice[238]
- ThoughtWorks[239]
- 트위치[240]
- 우버[241]
- Zerodha
Go는 강력한 표준 라이브러리와 사용 편의성 덕분에 다양한 분야에서 널리 채택되었다.[134] 주요 응용 분야는 다음과 같다. HTTPS 설정을 자동화하는 웹 서버인 Caddy,[135] 소프트웨어 개발 및 배포의 복잡성을 완화하는 것을 목표로 컨테이너화를 위한 플랫폼을 제공하는 Docker,[136] 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 쿠버네티스,[137] 확장성과 강력한 일관성을 위해 설계된 분산 SQL 데이터베이스인 CockroachDB,[138] 그리고 속도와 유연성을 우선시하여 개발자가 웹사이트를 효율적으로 만들 수 있도록 하는 정적 사이트 생성기인 Hugo.[139]
6. 1. 한국에서의 활용
Go는 한국에서도 여러 프로젝트와 기업에서 활용되고 있다. 그러나 주어진 소스에는 한국에서의 구체적인 활용 사례가 언급되지 않았으므로, 이 문장은 소스에 기반한 정보가 아니다. 따라서 삭제한다.7. 비판 및 논란
Go는 출시 초기에 제네릭 프로그래밍 및 예외 처리와 같은 기능이 없어 비판을 받았다.[14] 제네릭은 1.18 버전에서 추가되었지만,[84] 예외 처리는 여전히 `panic`/`recover` 메커니즘을 통해 제한적으로 지원된다.[119][120] Go는 표준 오류 타입을 사용하는 다중 값 반환을 통해 오류를 처리하는 방식을 선호한다.[14]
Go는 다른 언어에서 흔히 사용되는 특정 기능을 의도적으로 생략했는데, 여기에는 (구현) 상속, 어설션,[14] 포인터 연산,[14] 암시적 형 변환, 태그 없는 유니온 등이 포함된다.[14] 설계자들은 세 명 모두가 동의한 기능만 추가했다.[114] 타입 상속을 생략하고 인터페이스를 사용하여 동적 디스패치를 달성하고, 조합을 사용하여 코드를 재사용하도록 권장했다.[14]
Engine Yard의 데이브 아스텔스는 2009년에 Go가 배우기 쉽고, 기본적인 언어 개념이 최소화되어 있으며, 구문이 깔끔하고 명확하며 모호하지 않도록 설계되었다고 평가했다.[141]
브루스 에켈은 C++의 복잡성과 그로 인한 생산성 저하는 더 이상 정당화되지 않으며, C++ 프로그래머가 C 호환 언어를 사용하기 위해 거쳐야 했던 모든 불필요한 과정은 시간과 노력을 낭비하는 것이라고 언급했다. Go는 C++가 원래 해결하려 했던 문제 유형에 훨씬 더 적합하다고 평가했다.[145]
2011년, 구글 엔지니어 R. Hundt는 C++ (GCC), Java 및 Scala와 비교하여 Go 언어와 구현을 평가하면서, Go는 간결하고 표준화된 표기법을 가능하게 하는 흥미로운 언어 기능을 제공하지만, 컴파일러가 아직 미숙하여 성능과 바이너리 크기 모두에 반영된다고 평가했다.[146] 그러나 Go 개발팀은 Hundt의 평가에 대해 반박하며, Go 코드를 최적화하여 C++ 버전만큼 거의 빠르게 실행되도록 개선했다.[147]
Go의 ''nil''은 대수적 자료형의 부재와 결합되어 실패와 기저 사례를 처리하는 데 어려움을 초래한다는 비판이 있다.[148][149] 또한, Go는 여는 중괄호가 자체 줄에 나타나는 것을 허용하지 않아 모든 Go 프로그래머가 동일한 중괄호 스타일을 사용해야 한다.[150] Go는 정확성과 유연성보다는 구현의 단순성에 초점을 맞춘다는 비판도 있는데, 예를 들어 모든 플랫폼에서 POSIX 파일 의미 체계를 사용하므로 Windows와 같이 표준을 따르지 않는 플랫폼에서 잘못된 정보를 제공한다.[151][152]
참조
[1]
웹사이트
Codewalk: First-Class Functions in Go
https://go.dev/doc/c[...]
[2]
웹사이트
Is Go an object-oriented language?
https://golang.org/d[...]
2019-04-13
[3]
웹사이트
Go: code that grows with grace
https://talks.golang[...]
2018-06-24
[4]
웹사이트
The Go Programming Language Specification - the Go Programming Language
https://go.dev/ref/s[...]
[5]
웹사이트
Why doesn't Go have "implements" declarations?
https://golang.org/d[...]
2015-10-01
[6]
웹사이트
Rob Pike on Twitter
https://twitter.com/[...]
2014-12-22
[7]
웹사이트
lang/go: go-1.4
http://ports.su/lang[...]
2015-01-19
[8]
웹사이트
Go Porting Efforts
http://go-lang.cat-v[...]
cat-v
2010-01-18
[9]
웹사이트
Text file LICENSE
http://golang.org/LI[...]
2012-10-05
[10]
웹사이트
Additional IP Rights Grant
http://golang.org/PA[...]
2012-10-05
[11]
웹사이트
Go Introduction
https://www.w3school[...]
2024-11-23
[12]
웹사이트
Go Introduction
https://www.w3school[...]
2024-11-23
[13]
뉴스
Google's Go: A New Programming Language That's Python Meets C++
https://techcrunch.c[...]
2010-01-18
[14]
웹사이트
Language Design FAQ
http://golang.org/do[...]
2010-02-27
[15]
웹사이트
Google Go boldly goes where no code has gone before
https://www.theregis[...]
2011-05-05
[16]
웹사이트
Is the language called Go or Golang?
https://go.dev/doc/f[...]
2022-03-16
[17]
웹사이트
Go 1.5 Release Notes
https://golang.org/d[...]
2016-01-28
[18]
웹사이트
The Go programming language
https://github.com/g[...]
2024-11-01
[19]
웹사이트
gofrontend
https://github.com/g[...]
2024-11-01
[20]
웹사이트
gccgo
https://gcc.gnu.org/[...]
2024-11-01
[21]
웹사이트
Gollvm
https://go.googlesou[...]
2024-11-01
[22]
웹사이트
A compiler from Go to JavaScript for running Go code in a browser: Gopherjs/Gopherjs
https://github.com/g[...]
[23]
웹사이트
Go at Google: Language Design in the Service of Software Engineering
https://talks.golang[...]
2018-10-08
[24]
웹사이트
Another Go at Language Design
http://www.stanford.[...]
Stanford University
2010-04-28
[25]
웹사이트
Frequently Asked Questions (FAQ) - The Go Programming Language
https://golang.org/d[...]
2016-02-26
[26]
웹사이트
Dr. Dobb's: Interview with Ken Thompson
http://www.drdobbs.c[...]
2014-02-07
[27]
웹사이트
Less is exponentially more
http://commandcenter[...]
[28]
웹사이트
The Evolution of Go
https://talks.golang[...]
[29]
웹사이트
Hey! Ho! Let's Go!
https://opensource.g[...]
2018-05-17
[30]
뉴스
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.
https://www.cnet.com[...]
CBS Interactive Inc
2017-08-06
[31]
웹사이트
Release History
https://golang.org/d[...]
[32]
뉴스
Go FAQ: Is Google using Go internally?
https://golang.org/d[...]
2013-03-09
[33]
웹사이트
The Go Gopher - The Go Programming Language
https://go.dev/blog/[...]
2023-02-09
[34]
웹사이트
Go fonts
https://blog.golang.[...]
Go
2019-03-12
[35]
웹사이트
Go Font TTFs
https://github.com/g[...]
2019-04-02
[36]
웹사이트
Go's New Brand
https://blog.golang.[...]
2018-11-09
[37]
웹사이트
Go Developer Survey 2020 Results
https://go.dev/blog/[...]
2021-03-09
[38]
웹사이트
Arrays, slices (and strings): The mechanics of 'append'
http://blog.golang.o[...]
2015-03-07
[39]
웹사이트
E2E: Erik Meijer and Robert Griesemer
http://channel9.msdn[...]
Microsoft
2012-05-07
[40]
웹사이트
Go 2 Draft Designs
https://go.googlesou[...]
2018-09-12
[41]
웹사이트
The Go Blog: Go 2 Draft Designs
https://blog.golang.[...]
2018-08-28
[42]
웹사이트
Proposal: A built-in Go error check function, "try"
https://github.com/g[...]
2022-03-16
[43]
웹사이트
" Type Parameters\u00A0— Draft Design"
https://go.googlesou[...]
[44]
웹사이트
" Generics in Go"
https://bitfieldcons[...]
2021-12-17
[45]
웹사이트
Go 1.18 is released!
https://go.dev/blog/[...]
2022-03-15
[46]
웹사이트
Go 1 and the Future of Go Programs
https://golang.org/d[...]
[47]
웹사이트
Go 1.23 Release Notes
https://go.dev/doc/g[...]
[48]
웹사이트
Release History
https://golang.org/d[...]
[49]
웹사이트
Backward Compatibility, Go 1.21, and Go 2
https://go.dev/blog/[...]
[50]
웹사이트
A Quick Guide to Go's Assembler
https://go.dev/doc/a[...]
2021-12-31
[51]
웹사이트
The Go Programming Language
https://www.youtube.[...]
YouTube
2011-07-01
[52]
AV media
The Go Programming Language
https://www.youtube.[...]
Google
2009-11-10
[53]
웹사이트
Download and install packages and dependencies
http://golang.org/cm[...]
[54]
웹사이트
GoDoc
http://godoc.org
[55]
Podcast
The Changelog
http://5by5.tv/chang[...]
2013-10-07
[56]
웹사이트
Go Programming Language Specification, §Semicolons
https://golang.org/r[...]
[57]
웹사이트
Effective Go, §Semicolons
https://golang.org/d[...]
[58]
웹사이트
The Go Programming Language Specification
https://golang.org/r[...]
[59]
웹사이트
Go Syntax
https://www.w3school[...]
2024-11-23
[60]
웹사이트
Strings, bytes, runes and characters in Go
http://blog.golang.o[...]
2013-10-23
[61]
웹사이트
Structs and Interfaces — An Introduction to Programming in Go
https://www.golang-b[...]
2018-10-15
[62]
웹사이트
Go Slices: usage and internals
http://blog.golang.o[...]
[63]
웹사이트
Effective Go: Slices
http://golang.org/do[...]
[64]
웹사이트
Selectors
https://golang.org/r[...]
[65]
웹사이트
Calls
https://golang.org/r[...]
[66]
웹사이트
Go Programming Language Specification, §Package unsafe
https://golang.org/r[...]
[67]
웹사이트
The Go Programming Language Specification
https://go.dev/ref/s[...]
2021-12-31
[68]
웹사이트
The Go Programming Language Specification
http://golang.org/re[...]
[69]
웹사이트
A tour of go
https://go.dev/tour/[...]
[70]
웹사이트
The Go Programming Language Specification
http://golang.org/re[...]
[71]
웹사이트
The Go Programming Language Specification
https://go.dev/ref/s[...]
2021-12-31
[72]
웹사이트
The Go Programming Language Specification
http://golang.org/re[...]
[73]
서적
The Way to Go: A Thorough Introduction to the Go Programming Language
iUniverse
[74]
웹사이트
The Evolution of Go
https://talks.golang[...]
2016-03-13
[75]
웹사이트
Duck Typing and the Go Programming Language
http://www.drdobbs.c[...]
2009-11-24
[76]
웹사이트
Duck typing in Go
https://medium.com/@[...]
2016-03-10
[77]
웹사이트
Frequently Asked Questions (FAQ) - The Go Programming Language
https://golang.org/d[...]
[78]
웹사이트
The Go Programming Language Specification
http://golang.org/re[...]
[79]
웹사이트
The Go Programming Language Specification
http://golang.org/re[...]
[80]
웹사이트
reflect package
https://pkg.go.dev/r[...]
[81]
웹사이트
map[string]interface{} in Go
https://bitfieldcons[...]
2020-06-06
[82]
웹사이트
Go Data Structures: Interfaces
http://research.swtc[...]
2012-11-15
[83]
웹사이트
The Go Programming Language Specification
http://golang.org/re[...]
[84]
웹사이트
Go 1.18 Release Notes: Generics
https://go.dev/doc/g[...]
2022-03-16
[85]
웹사이트
Type Parameters Proposal
https://go.googlesou[...]
2023-06-25
[86]
웹사이트
The Go Programming Language Specification - The Go Programming Language
https://go.dev/ref/s[...]
2023-06-25
[87]
웹사이트
An Introduction To Generics - The Go Programming Language
https://go.dev/blog/[...]
2023-06-25
[88]
웹사이트
Type Parameters Proposal
https://go.googlesou[...]
2023-06-25
[89]
웹사이트
A Tutorial for the Go Programming Language
http://golang.org/do[...]
2013-03-10
[90]
웹사이트
go
http://golang.org/cm[...]
[91]
웹사이트
How to Write Go Code
https://golang.org/d[...]
[92]
웹사이트
Concurrency is not Parallelism
http://vimeo.com/497[...]
2012-09-18
[93]
서적
The Go programming language
Addison-Wesley
2016
[94]
웹사이트
Effective Go
http://golang.org/do[...]
[95]
서적
Programming in Go: Creating Applications for the 21st Century
Addison-Wesley
[96]
웹사이트
The Go Memory Model
http://golang.org/re[...]
2017-04-10
[97]
웹사이트
Go Concurrency Patterns
http://talks.golang.[...]
[98]
웹사이트
Recycling Memory Buffers in Go
http://blog.cloudfla[...]
2013-08-24
[99]
웹사이트
tree.go
http://golang.org/do[...]
[100]
웹사이트
Iterators in Go
http://ewencp.org/bl[...]
[101]
웹사이트
A Descent Into Limbo
http://www.vitanuova[...]
[102]
웹사이트
The Go Memory Model
http://golang.org/do[...]
2011-01-05
[103]
간행물
Multi-core parallel programming in Go
http://www.ualr.edu/[...]
2015-05-14
[104]
간행물
Examining the expert gap in parallel programming
http://se.inf.ethz.c[...]
[105]
웹사이트
Share Memory By Communicating
https://go.dev/doc/c[...]
[106]
웹사이트
Off to the Races
http://research.swtc[...]
[107]
웹사이트
Go at Google: Language Design in the Service of Software Engineering
http://talks.golang.[...]
Google, Inc.
2012-10-25
[108]
웹사이트
Introducing the Go Race Detector
https://go.dev/blog/[...]
2013-06-26
[109]
웹사이트
Go 1.6 Release Notes - The Go Programming Language
https://go.dev/doc/g[...]
2023-11-17
[110]
웹사이트
Frequently Asked Questions (FAQ) - the Go Programming Language
https://golang.org/d[...]
[111]
웹사이트
A Story of a Fat Go Binary
https://medium.com/@[...]
2018-09-21
[112]
웹사이트
Go Programming Language Specification, §Interface types
https://golang.org/r[...]
[113]
웹사이트
Go Programming Language Specification, §Type assertions
https://golang.org/r[...]
[114]
인터뷰
All Systems Are Go
http://www.informit.[...]
2010-08-17
[115]
학회자료
GoHotDraw: evaluating the Go programming language with design patterns
ACM
[116]
웹사이트
Language Design FAQ
http://golang.org/do[...]
2009-11-13
[117]
웹사이트
Proposal for an exception-like mechanism
https://groups.googl[...]
2010-03-25
[118]
웹사이트
Weekly Snapshot History
http://golang.org/do[...]
[119]
웹사이트
Panic And Recover
https://code.google.[...]
Go wiki
[120]
웹사이트
Effective Go
https://golang.org/d[...]
[121]
웹사이트
gofmt
https://golang.org/c[...]
2021-02-05
[122]
웹사이트
golang/lint public archive
https://github.com/g[...]
2022-11-30
[123]
웹사이트
Effective Go
http://golang.org/do[...]
[124]
웹사이트
Unused local variables
https://yourbasic.or[...]
2021-02-11
[125]
웹사이트
Unused package imports
https://yourbasic.or[...]
2021-02-11
[126]
웹사이트
Code Review Comments
https://github.com/g[...]
2018-07-03
[127]
웹사이트
Talks
https://talks.golang[...]
2018-07-03
[128]
웹사이트
Errors Are Values
http://blog.golang.o[...]
2018-07-03
[129]
웹사이트
tools/gopls/README.md at master · golang/tools
https://github.com/g[...]
2023-11-17
[130]
웹사이트
fmt
https://golang.org/p[...]
2019-04-08
[131]
서적
The Go Programming Language Phrasebook
https://books.google[...]
Addison-Wesley
[132]
웹사이트
testing
https://golang.org/p[...]
2020-12-27
[133]
웹사이트
http package - net/http - Go Packages
https://pkg.go.dev/n[...]
2024-11-23
[134]
간행물
Introduction to the Go Programming Language
https://www.codemag.[...]
2023-09-08
[135]
간행물
Simply Secure
https://www.linux-ma[...]
2023-09-08
[136]
간행물
Introduction to Containerization Using Docker
https://www.codemag.[...]
2023-09-08
[137]
간행물
Kubernetes Security for Starters
https://www.codemag.[...]
2023-09-08
[138]
학회자료
Proceedings of the 2020 ACM SIGMOD International Conference on Management of Data
2020-06-11
[139]
뉴스
Static Site Generation with Hugo
https://www.linuxjou[...]
2023-09-08
[140]
뉴스
Interfaces vs Inheritance (or, watch out for Go!)
http://www.artima.co[...]
artima
2009-11-15
[141]
뉴스
Ready, Set, Go!
https://www.engineya[...]
engineyard
2009-11-09
[142]
웹사이트
Google's Go Wins Programming Language Of The Year Award
http://jaxenter.com/[...]
jaxenter
2012-12-05
[143]
웹사이트
TIOBE Programming Community Index for June 2015
http://www.tiobe.com[...]
TIOBE Software
2015-07-05
[144]
웹사이트
TIOBE Index
https://www.tiobe.co[...]
2024-07-15
[145]
웹사이트
Calling Go from Python via JSON-RPC
http://www.artima.co[...]
2011-08-29
[146]
conference
Loop recognition in C++/Java/Go/Scala
https://days2011.sca[...]
[147]
웹사이트
Google Go strikes back with C++ bake-off
https://www.theregis[...]
2011-07-01
[148]
웹사이트
Why Go is not Good
http://yager.io/prog[...]
2018-11-04
[149]
웹사이트
Everyday Hassles in Go
https://crufter.com/[...]
2018-11-04
[150]
웹사이트
Why are there braces but no semicolons? And why can't I put the opening brace on the next line?
https://golang.org/d[...]
2020-03-26
[151]
웹사이트
I want off Mr. Golang's Wild Ride
https://fasterthanli[...]
2020-11-17
[152]
웹사이트
proposal: os: Create/Open/OpenFile() set FILE_SHARE_DELETE on windows #32088
https://github.com/g[...]
2020-11-17
[153]
웹사이트
Understanding Real-World Concurrency Bugs in Go
https://songlh.githu[...]
2019
[154]
뉴스
Google didn't google "Go" before naming their programming language'
http://www.geek.com/[...]
2016-05-26
[155]
뉴스
Google 'Go' Name Brings Accusations Of Evil'
http://www.informati[...]
InformationWeek
2010-01-18
[156]
웹사이트
'Issue 9 - go — I have already used the name for *MY* programming language'
https://github.com/g[...]
Google Inc.
2010-10-12
[157]
웹사이트
Why doesn't Go have "implements" declarations?
https://go.dev/doc/f[...]
2015-10-01
[158]
뉴스
Rob Pike on Twitter
https://twitter.com/[...]
2016-03-13
[159]
뉴스
Google’s Go: A New Programming Language That’s Python Meets C++
https://techcrunch.c[...]
2010-01-18
[160]
웹사이트
Language Design FAQ
https://go.dev/doc/f[...]
2010-01-16
[161]
웹사이트
Google Go boldly goes where no code has gone before
https://www.theregis[...]
2011-05-05
[162]
문서
go.dev
https://go.dev/LICEN[...]
[163]
문서
"{{lang|en|go installation guide}}"
https://go.dev/doc/i[...]
[164]
웹사이트
"{{lang|en|Go version 1 is released}}"
https://go.dev/blog/[...]
2012-03-29
[165]
웹사이트
プログラミング言語「Go 1.4」がリリース、Androidを正式にサポート
http://codezine.jp/a[...]
2015-08-26
[166]
웹사이트
Go 1.5 is released
https://go.dev/blog/[...]
2015-08-26
[167]
문서
"{{lang|en|Google App Engine Blog, Tuesday, May 10, 2011}}"
https://googleappeng[...]
[168]
웹사이트
Go 1.11 is released
https://go.dev/blog/[...]
2018-10-04
[169]
문서
Frequently Asked Questions (FAQ) - The Go Programming Language
https://tip.golang.o[...]
[170]
웹사이트
Hey! Ho! Let's Go!
https://opensource.g[...]
Google
2018-05-17
[171]
뉴스
Go version 1 is released - The Go Blog
https://blog.golang.[...]
2018-02-04
[171]
뉴스
"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."
https://www.cnet.com[...]
CBS Interactive Inc
2017-08-06
[171]
웹사이트
Release History
https://go.dev/doc/d[...]
2018-07-24
[172]
뉴스
Go FAQ: Is Google using Go internally?
https://go.dev/doc/f[...]
2013-03-09
[173]
웹사이트
Google's In-House Programming Language Now Runs on Phones
https://www.wired.co[...]
2015-08-19
[174]
웹사이트
Go 1.5 Release Notes
https://go.dev/doc/g[...]
2016-01-28
[174]
웹사이트
Go 1.5が登場、Androidに続いてiOSアプリも開発可能。ガベージコレクションも大幅に改善
http://www.publickey[...]
2015-08-24
[175]
웹사이트
FAQ: Implementation
https://go.dev/doc/f[...]
2010-01-16
[175]
웹사이트
Installing GCC: Configuration
https://gcc.gnu.org/[...]
2011-12-03
[176]
웹사이트
Another Go at Language Design
http://www.stanford.[...]
스탠퍼드 대학교
2018-07-24
[177]
웹사이트
Frequently Asked Questions (FAQ) - The Go Programming Language
https://go.dev/doc/f[...]
2016-02-26
[178]
웹사이트
Dr. Dobb's: Interview with Ken Thompson
http://www.drdobbs.c[...]
2014-02-07
[179]
문서
Go 1.6 Release Notes - The Go Programming Language
https://go.dev/doc/g[...]
[180]
웹사이트
"「Go 1.6」リリース、細かな性能改善などがメインのリリースに"
https://mag.osdn.jp/[...]
2016-02-20
[181]
웹사이트
Toward Go 2 - The Go Blog
https://go.dev/blog/[...]
2018-02-04
[182]
웹사이트
Go 1.17 is released - go.dev
https://go.dev/blog/[...]
2021-09-19
[183]
서적
The Go Programming Language Phrasebook
https://books.google[...]
Addison-Wesley
[184]
문서
https://go.dev/doc/f[...]
[185]
문서
Go 1.9 Release Notes - The Go Programming Language
https://go.dev/doc/g[...]
[186]
문서
reflect - The Go Programming Language
https://pkg.go.dev/r[...]
[187]
문서
Frequently Asked Questions (FAQ) - The Go Programming Language
https://go.dev/doc/f[...]
[188]
웹인용
First-Class Functions in Go
https://golang.org/d[...]
2018-11-14
[189]
웹인용
Is Go an object-oriented language?
https://golang.org/d[...]
2019-04-13
[190]
웹인용
Go: code that grows with grace
https://talks.golang[...]
2018-06-24
[191]
뉴스
Google’s Go: A New Programming Language That’s Python Meets C++
https://techcrunch.c[...]
2010-01-18
[192]
웹인용
Why doesn't Go have "implements" declarations?
https://golang.org/d[...]
2015-10-01
[193]
웹인용
Google Go boldly goes where no code has gone before
https://www.theregis[...]
2011-05-05
[194]
웹인용
Is the language called Go or Golang?
https://tip.golang.o[...]
2020-03-26
[195]
웹인용
Go 1.5 Release Notes
https://golang.org/d[...]
2016-01-28
[196]
저널
Google's In-House Programming Language Now Runs on Phones
https://www.wired.co[...]
2015-08-19
[197]
웹인용
Go 1.11 is Released - The Go Blog
https://blog.golang.[...]
2019-01-01
[198]
웹인용
FAQ: Implementation
http://golang.org/do[...]
2010-01-18
[199]
웹인용
Installing GCC: Configuration
https://gcc.gnu.org/[...]
2011-12-03
[200]
웹인용
A compiler from Go to JavaScript for running Go code in a browser: Gopherjs/Gopherjs
https://github.com/g[...]
2020-04-18
[201]
뉴스
Go FAQ: Is Google using Go internally?
http://golang.org/do[...]
2013-03-09
[202]
웹인용
Another Go at Language Design
http://www.stanford.[...]
스탠퍼드 대학교
2010-04-28
[203]
웹인용
Frequently Asked Questions (FAQ) - The Go Programming Language
https://golang.org/d[...]
2016-02-26
[204]
웹인용
Dr. Dobb's: Interview with Ken Thompson
http://www.drdobbs.c[...]
2014-02-07
[205]
웹인용
Less is exponentially more
http://commandcenter[...]
[206]
웹인용
The Evolution of Go
https://sourcegraph.[...]
2017-07-10
[207]
웹인용
Release History
https://golang.org/d[...]
[208]
웹인용
Google's In-House Programming Language Now Runs on Phones
https://www.wired.co[...]
2015-08-19
[209]
웹인용
Go 1.5 Release Notes
https://golang.org/d[...]
2016-01-28
[210]
웹인용
FAQ: Implementation
http://golang.org/do[...]
2010-01-18
[211]
웹인용
Installing GCC: Configuration
https://gcc.gnu.org/[...]
2011-12-03
[212]
웹사이트
https://github.com/g[...]
[213]
웹사이트
Share by communicating - Effective Go
http://golang.org/do[...]
[214]
웹사이트
Share memory by communicating
http://blog.golang.o[...]
Andrew Gerrand
[215]
웹사이트
Codewalk: Share memory by communicating
http://golang.org/do[...]
Andrew Gerrand
[216]
웹사이트
Concurrency is not Parallelism
http://vimeo.com/497[...]
롭 파이크
[217]
웹인용
How to Mine Ethereum on Your Computer
http://www.investope[...]
[218]
웹인용
Gogs - Go Git Service - a painless self-hosted Git service
https://gogs.io
[219]
웹사이트
The Case For Go
https://gist.github.[...]
Erik Unger
[220]
웹사이트
Four years of Go
http://blog.golang.o[...]
Andrew Gerrand
[221]
웹인용
AeroFS - A little golang way
https://web.archive.[...]
2017-07-10
[222]
웹인용
Chango
https://github.com/c[...]
[223]
웹사이트
Go at CloudFlare
http://blog.cloudfla[...]
John Graham-Cumming
[224]
웹사이트
What we've been doing with Go
http://blog.cloudfla[...]
John Graham-Cumming
[225]
웹인용
Go at CoreOS
https://blog.gophera[...]
[226]
웹인용
Couchbase
https://github.com/c[...]
[227]
웹사이트
Open Sourcing Our Go Libraries
https://tech.dropbox[...]
Patrick Lee
2014-07-07
[228]
웹인용
dl.google.com: Powered by Go
http://talks.golang.[...]
[229]
웹사이트
Rewriting a Large Production System in Go
http://matt-welsh.bl[...]
Matt Welsh
[230]
웹사이트
High Performance Apps on Google App Engine
http://talks.golang.[...]
David Symonds
[231]
웹인용
Mongo DB
http://techblog.netf[...]
[232]
웹인용
The Netflix Tech Blog: Application data caching using SSDs
http://techblog.netf[...]
[233]
웹인용
Google+ post by Don Dwoske
https://plus.google.[...]
2017-01-21
[234]
웹인용
Search & Advances
https://web.archive.[...]
2017-07-10
[235]
웹인용
ReplicatedHQ
https://github.com/r[...]
[236]
웹인용
How to Convince Your Company to Go With Golang
https://sendgrid.com[...]
[237]
웹사이트
Go at SoundCloud
http://backstage.sou[...]
Peter Bourgon
[238]
웹인용
Go at Google I/O and Gopher SummerFest - The Go Blog
http://blog.golang.o[...]
[239]
웹인용
CoyIM
https://github.com/t[...]
[240]
웹사이트
Go’s march to low-latency GC
https://blog.twitch.[...]
Rhys Hiltner
2016-07-05
[241]
웹인용
How We Built Uber Engineering’s Highest Query per Second Service Using Go
https://eng.uber.com[...]
2016-03-02
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com