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 )
다른 파일을 가져오는 방법
- 상대 경로 import: 상대 경로로 다른 파일을 가져옵니다. 같은 프로젝트의 다른 파일을 참조할 때 적합합니다. 예:
import "./utils"는 현재 프로젝트의utils파일을 가져옵니다. - 절대 경로 import: 절대 경로로 다른 파일을 가져옵니다. 다른 프로젝트나 라이브러리에 있는 파일을 참조할 때 적합합니다. 예:
import "github.com/example/package"는github.com/example/package패키지의 파일을 가져옵니다. - 표준 라이브러리 import: Go 언어는 추가 import 없이 바로 쓸 수 있는 표준 라이브러리를 많이 제공합니다. 예:
import "fmt"는 표준 라이브러리의fmt패키지를 가져옵니다. - 별칭 import: 가져온 패키지나 파일에 별칭을 붙여 코드에서 더 짧은 이름을 쓸 수 있습니다. 예:
import utils "github.com/example/package"는github.com/example/package에 별칭utils를 붙이고, 이후utils로 패키지 내용에 접근합니다. - 공백 식별자 import: 파일의
init함수만 실행하고 나머지 내용은 쓰지 않을 때가 있습니다. 이때 공백 식별자_로 import합니다. 예:import _ "github.com/example/package"는github.com/example/package패키지의init함수를 실행하지만, 코드에서 그 패키지의 다른 내용은 쓰지 않습니다. - 점 연산자 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함수 문서를 표시합니다.
마지막 업데이트