Skip to Content
블로그Golang 빠른 참조

Golang 빠른 참조

컬렉션 사용법

슬라이스 사용법

// 특징: 가변, 참조 전달, 힙 할당 a := []int{1,2,3,4,5} // 축약과 초기화 // 자리 표시로 인덱스를 지정할 수도 있음 a := []int{0:1,4:3} // 추가 a = append(a, 6) // 삭제 // 삭제할 요소의 인덱스 index := 2 // 요소 삭제 slice = append(slice[:index], slice[index+1:]...) // 배열 병합이기도 함 // 수정과 읽기는 배열과 동일

슬라이스의 길이와 용량

// Length(길이)는 슬라이스가 현재 담고 있는 요소 수. // Capacity(용량)는 기저 배열의 크기, 즉 슬라이스가 수용할 수 있는 요소 수의 상한. a := make([]byte, 5, 10) // 슬라이스 a는 최대 10개의 byte 요소를 수용할 수 있지만 현재는 5개만 있음. // 용량은 생략 가능 a := make([]byte, 5) // 구문 설명 a[b:c] => // b는 현재 인덱스, 비어 있으면 인덱스는 0 // c는 현재 인덱스, 비어 있으면 인덱스는 len(a) s := x[:] // 슬라이스 s는 배열 x의 메모리 공간을 가리킴. s 값을 바꾸면 x 값에도 영향

슬라이스 순회 방법

for k,v := range a {} for _,v := range a {} // 인덱스가 필요 없음 for k := range a {} // 인덱스만 필요 for range time.Tick(time.Second) {} // 둘 다 필요 없음

배열 사용법

// 특징: 고정 크기, 값 전달, 스택 할당 a := [5]int{1,2,3,4,5} // 추가·삭제 불가 // 수정 a[3] = 6 // 읽기 a[3]

switch 사용법

switch a { case "a": // todo case "b", "c": // b 또는 c와 일치 // todo default: // todo } // 앞에 문을 둘 수도 있음 switch a:=1; a { ... }

for 루프 사용법

for {} // while true와 동일 for a < 19 {} // while a < 19와 동일 for a := 10; a<99; a++ {} // 일반적인 사용 // 바깥 레이블과 함께 break / continue도 지원 here: for i := 0; i < 2; i++ { for j := i + 1; j < 3; j++ { if i == 0 { continue here } fmt.Println(j) if j == 2 { break } } } there: for i := 0; i < 2; i++ { for j := i + 1; j < 3; j++ { if j == 1 { continue } fmt.Println(j) if j == 2 { break there } } }

if 구조 사용법

if a > 0 {} // 추가 문을 두고 세미콜론으로 끝낼 수 있음 if a := b+c; a > 0 {}

패키지와 기본 제약

각 Go 소스 파일(주석 제외)의 맨 앞에 package 선언을 둡니다. 실행 파일은 main 패키지에 있습니다. 관례: 패키지 이름 == 패키지 import 경로의 마지막 이름(import 경로 math/rand => 패키지 이름 rand). 대문자로 시작하는 식별자: 내보낸 식별자, 다른 패키지에 보임. 소문자로 시작하는 식별자: 비공개 식별자, 다른 패키지에 보이지 않음.

함수 선언 방법

func a() {} func a(b int){} func a(b, c int){} // 같은 타입이 여러 개 func a() string {} // 반환값 func a() (int,string){ return 1, "1" } // 반환 식별자, 바로 return func a() (b int, c string){ b = 1 c = "1" return }

함수 전달과 클로저

// 매개변수로 사용 add := func(a,b)int{ return a+b } // 반환값으로 사용 func wrapAdd() (add func() int) { c := 1 add = func() int { return c } return }

가변 인자 함수

func a(args ...int) int { return 1 }

변수 선언 방법

var a int = 1 a := 1 const a = "1"

iota 기법

  • 열거값 자동 증가

    const ( Red = iota // 0 Green // 1 Blue // 2 )
  • 비트 연산으로 플래그 상수 만들기

    const ( FlagNone = 0 // 0 FlagA = 1 << iota // 1 FlagB = 1 << iota // 2 FlagC = 1 << iota // 4 )
  • 불필요한 값 건너뛰기

    const ( _ = iota // 첫 열거값 건너뛰기 January = 1 + iota // 1 February // 2 March // 3 )

다른 파일을 가져오는 방법

  1. 상대 경로 import: 상대 경로로 다른 파일을 가져옵니다. 같은 프로젝트의 다른 파일을 참조할 때 적합합니다. 예: import "./utils"는 현재 프로젝트의 utils 파일을 가져옵니다.
  2. 절대 경로 import: 절대 경로로 다른 파일을 가져옵니다. 다른 프로젝트나 라이브러리에 있는 파일을 참조할 때 적합합니다. 예: import "github.com/example/package"는 github.com/example/package 패키지의 파일을 가져옵니다.
  3. 표준 라이브러리 import: Go 언어는 추가 import 없이 바로 쓸 수 있는 표준 라이브러리를 많이 제공합니다. 예: import "fmt"는 표준 라이브러리의 fmt 패키지를 가져옵니다.
  4. 별칭 import: 가져온 패키지나 파일에 별칭을 붙여 코드에서 더 짧은 이름을 쓸 수 있습니다. 예: import utils "github.com/example/package"는 github.com/example/package에 별칭 utils를 붙이고, 이후 utils로 패키지 내용에 접근합니다.
  5. 공백 식별자 import: 파일의 init 함수만 실행하고 나머지 내용은 쓰지 않을 때가 있습니다. 이때 공백 식별자 _로 import합니다. 예: import _ "github.com/example/package"는 github.com/example/package 패키지의 init 함수를 실행하지만, 코드에서 그 패키지의 다른 내용은 쓰지 않습니다.
  6. 점 연산자 import는 코드를 더 간결하게 만들 수 있지만 가독성을 떨어뜨릴 수도 있습니다.

자주 쓰는 CLI 명령

  • go build: Go 코드를 컴파일하고 실행 파일을 생성합니다. 예: go build main.go는 main.go를 컴파일해 실행 파일을 만듭니다.
  • go run: Go 코드를 컴파일하고 실행합니다. 예: go run main.go는 main.go를 컴파일한 뒤 바로 실행합니다.
  • go test: Go 단위 테스트를 실행합니다. go test로 프로젝트의 테스트 파일을 자동 실행하고 결과를 출력합니다.
  • go get: 서드파티 의존 패키지를 가져와 설치합니다. 예: go get github.com/example/package는 github.com/example/package 의존을 가져와 설치합니다.
  • go mod init: Go 프로젝트 모듈 관리를 초기화합니다. go mod init을 실행하면 의존 관리용 새 go.mod를 만들 수 있습니다.
  • go mod tidy: 프로젝트에서 쓰이지 않는 의존을 자동으로 정리합니다. go mod tidy는 의존을 검사하고 더 이상 필요 없는 것을 제거합니다.
  • go mod vendor: 프로젝트 의존을 vendor 디렉터리로 복사합니다. go mod vendor로 오프라인 빌드와 배포를 위해 모든 의존을 프로젝트로 복사할 수 있습니다.
  • go doc: Go 코드 문서를 봅니다. 예: go doc fmt.Println은 fmt 패키지의 Println 함수 문서를 표시합니다.
마지막 업데이트