go

Topic: go

구조체 초기화 방법

C 구조체 초기화 다음 C 구조체 초기화 방법 중 문법에 위배되는 것은? (단, C99 기준) struct MyStruct { int a; int b; }; // method 1 struct MyStruct m1 = {0, 1}; // method 2 struct MyStruct m2; m2 = (struct MyStruct){0, 1}; // method 3 struct { int ...

메서드

Go는 클래스가 없다. What? Go는 객체지향언어가 아니란 말인가? 미리 놀랄 필요는 없다. Go는 클래스가 없는 대신 보다 유연한 방식을 제공한다. 먼저 객체의 멤버 함 ...

호출 연기

Defer는 호출을 연기하는 Go의 독특한 구문 중 하나이다. 호출을 연기한다는 것이 무슨 의미인지는 다음 C 코드를 예로 알아보자. #include <stdio.h>#include <stdlib.h> #define BUF_SIZE 512 int main(int argc, char *argv[]) { FILE* ...

배열, 슬라이스 그리고 맵

Go의 built-in 자료구조인 배열, 슬라이스, 맵에 대해 좀 더 자세히 살펴보자. 크기 배열, 슬라이스, 맵은 모두 복수의 요소를 저장할 수 있다. 따라서 몇 개의 요소를 가지고 ...

배열이나 슬라이스는 저장된 각 요소에 접근하기 위한 키로 숫자를 사용하는 자료구조이다. 반면 맵은 키로 숫자가 아닌 다양한 타입을 사용할 수 있다. Python의 dict ...

슬라이스

슬라이스는 앞서 살펴본 배열과 연관성이 높은 또 하나의 타입이다. 슬라이스의 특징을 간략히 요약하면 다음과 같다. 기반이 되는 배열, 문자열 또는 다른 슬라이스의 요 ...

배열

배열 역시 타입의 일종이다. 배열 작성 규칙은 다음과 같다. ArrayType = "[" ArrayLength "]" ElementType . ArrayLength = Expression . ElementType = Type . ArrayLength에 대해서는 두 가지 단서가 붙는데, 음수일 수 ...

함수 타입과 익명 함수

함수에서는 기본적인 함수 선언 및 호출 방법에 대해서 다뤘다. 해당 글을 시작할 때 함수를 타입으로 사용할 수도 있다고 언급했는데, 이 내용은 구조체 기초에서도 나온다 ...

상수에 대한 오해

상수에 대해서만 벌써 네 번째 글이다. 상수 별 것 없을 것 같은 상수의 별 것 정수형 상수의 내부 처리 그만큼 Go의 상수는 C/C++이나 Java를 사용했던 개발자가 오 ...

구조체 기초

구조체는 이름을 갖는 엘리먼트들을 묶어 놓은 타입이다. 당연한 얘기를 뭐 대단한 듯 하나 싶겠지만 앞서 다뤘던 기본 타입, 포인터, 함수, 아직 다루지 않은 배열, 슬라 ...

특수 함수들

본문 중 심볼(symbol)에 대한 내용은 편의상 리눅스 환경에서 빌드한 바이너리를 readelf 명령으로 확인한 결과입니다. C/C++, Java에서 가장 특이한 함수는 누가 뭐래 ...

함수

함수를 타입으로 사용하는 등 여러가지 복잡한 용법이 있지만 이 글에서는 기본적인 함수의 선언(declaration)과 정의(definition)에 대해 ...

정수형 상수의 내부 처리

이 글은 마지막 commit id가 4ba5527...인 Go 소스 코드를 기준으로 합니다. 함수명, 변수/상수명, 변수/상수값 등은 버전에 따라 다를 수 있습니다. 최신 Go ...

for 반복문

시작하기에 앞서 한 가지 중요한 사실을 미리 밝히고 넘어가자. Go에는 `while`이 없다! 반복문은 `for` 하나로 모두 작성한다. for 반복문의 작성 규칙은 아래와 같 ...

봉인해제 switch

다시 switch 작성 규칙을 자세히 보면 switch 뒤에도, case 뒤에도 단순히 Expression이 올 수 있다. C/C++, Java에 익숙한 개발자라면 단서를 기대할 것이다. C의 swi ...

switch 조건문

Go의 switch 조건문은 C/C++이나 Java에 비해 사용법이 굉장히 다양하다. 여기서는 기본 사용법에 대해서만 우선 알아보자. Go의 switch 작성 규칙은 다음과 같다. ...

if 조건문

Go의 if 조건문은 조건에 괄호(())를 쓰지 않아도 된다는 점을 제외하면 C/C++, Java 등 언어의 그것과 유사하다. 물론 조건에 괄호를 쓰는 것도 가능하며, 복잡한 조건인 경 ...

패키지, 임포트에 대한 심화 학습

이제 겨우 타입 정도를 다룬 마당에 굉장히 이른 감은 있지만, 패키지와 임포트가 나왔으니 짚고 넘어가자. Go도 당연히 다른 언어처럼 작성한 코드의 재사용이 가능하다 ...

포인터

Go의 포인터는 생김과 사용법이 C의 그것과 매우 유사하다. 먼저 포인터에 대한 규정을 살펴보면 다음과 같다. PointerType = "*" BaseType . BaseType = Type . C에서와 같이 타입 앞에 aste ...

임포트

외부 패키지에서 제공하는 기능을 사용하기 위해 Go에서는 import 명령을 사용한다. 작성 규칙은 다음과 같다. ImportDecl = "import" ( ImportSpec | "(" { ImportSpec ";" } ")" ) . ImportSpec = [ "." | PackageName ] ImportPath . ImportPath = ...

별 것 없을 것 같은 상수의 별 것

상수의 타입과 한계 명시적이지 않은 듯 명시적인 Go에서 한 것처럼 reflect 패키지를 이용해 타입을 명시하지 않은 상수의 타입에 대해 알아보자. package main import "fmt" import "reflect" func main() { const A = ...

상수

상수를 선언하는 방법은 var 대신 const를 사용한다는 점을 제외하면 변수를 선언하는 방법과 유사하다. ConstDecl = "const" ( ConstSpec | "(" { ConstSpec ";" } ")" ) . ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] . ...

명시적이지 않은 듯 명시적인 Go

변수에서 살펴 본 것처럼 Go는 변수를 선언할 때 초기값을 같이 입력하면 굳이 타입을 명시하지 않아도 된다. var i = 1 f := 3.14 c := 1.0 + 1.0i 그렇다면 이 경우 i, f, c의 타입 ...

타입

Go의 타입 작성법은 다음과 같다. Type = TypeName | TypeLit | "(" Type ")" . TypeName = identifier | QualifiedIdent . TypeLit = ArrayType | StructType | PointerType | FunctionType | InterfaceType | SliceType | MapType | ChannelType . 나머지는 차차 보도록 하고, 여기서는 predefined identifier 중 ty ...

변수

Go에서 변수 선언 규칙은 다음과 같다. VarDecl = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) . VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) . IdentifierList = identifier { "," identifier } . ExpressionList = Expression { "," Expression } . 복잡해 보이지만 하나 ...

패키지

모든 Go 프로그램은 패키지들로 구성된다. 프로그램은 main 패키지에서 시작한다. 관례상 패키지 이름은 임포트 경로의 마지막 엘리먼트로 한다. 패키지 작성 규정(cl ...

세미콜론

Go는 C/C++이나 Java처럼 세미콜론(;)을 사용하는 언어이다. 하지만 소스코드에서 세미콜론을 볼 일은 거의 없다. Go lexer가 몇 가지 간단한 규칙 ...

주석

// single line comment /* multi line comment */

시작 Go

Go 토픽은 제가 Go 언어를 공부하면서 정리한 내용들입니다. 그간 주로 C/C++을 사용해 왔던지라 ‘그에 비해 Go는 이렇더라’라는 내 ...