워크스페이스에 3개의 폴더를 생성했다. 소스코드를 저장하는 "src", 컴파일된 패키지를 저장하는 "pkg", go의 바이너리를 저장하는 "bin" 폴더이다.
패키지
패키지 이름은 모든 go 파일의 최상단에 선언한다.
package jacob
- go 프로그램은 한 개 이상의 패키지로 구성된다. 각 패키지는 한 개 이상의 go 소스파일을 포함하는 폴더이며, 모든 go 파일은 패키지에 속한다. 패키지 폴더는 워크스페이스의 src 폴더 하위에 위치한다.
- 패키지 이름은 소문자로 선언하며, 패키지의 폴더명은 패키지와 이름을 동일하게 지정한다.
- import 키워드를 이용해 패키지를 가져올 수 있다.
package jacob
import "fmt"
- 만약 다른 패키지 폴더 안에 존재한다면 아래와 같이 가져온다.
import "math/rand"
- 여러 패키지를 가져올 때는 아래와 같이 작성한다.
import (
"fmt"
"math/rand"
)
- go 언어에서는 사용하지 않는 패키지를 가져올 수 없다. 하지만 가져온 패키지를 직접적으로 직접적으로 사용하지 않는 경우도 있는데 그런 경우 해당 패키지 이름 앞에 밑줄(_)을 붙인다.
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
- 가장 많이 쓰는 패키지는 main 패키지이다. go 프로그램에서 가장 처음 실행되는 패키지다.
- go 프로그램을 컴파일하려면, main 패키지 경로로 이동하여 아래 명령어를 입력한다.
go install
// or
go build
- go install의 경우 컴파일이 완료되면 바이너리는 워크스페이스의 bin 폴더에 저장되며, go build 명령어는 현재 폴더에 바이너리를 생성한다. 만약 직접 지정하고 싶다면 아래와 같이 명령어를 입력하면 된다.
go build -o ./output/jacob.exe
변수와 자료형
- var 키워드를 사용해 변수를 선언한다.
// 단일 string형 변수 선언
var jacob string
// 복수 string형 변수 선언
var jacob1, jacob2 string
- 변수의 초기값 설정
// 자료형 + 초깃값 선언
var v1, v2, v3 string = "v1 string", "v2 string", "v3 string"
// 초깃값 선언
var v1, v2, v3 = "v1 string", "v2 string", "v3 string"
// 다른 자료형과 변수를 초기화
var v1, v2, v3 = "v1 string", 8, 12
// 가장 일반적인 방법
var (
c = "jacob"
o = 8
b = 12
)
- 함수 안에서 변수를 선언하고 초기화할 때는 var 키워드 대신 := 를 사용한다. 이때 변수의 자료형을 추론한다.
c := "jacob"
o := 8
b := 12
- 하지만 var 키워드는 자료형을 명시적으로 지정할 수 있어 유용하다.
- 자료형의 경우 아래와 같다.
- 초깃값이 없는 변수는 자료형에 따라 다른 제로 값(zero value)이 지정된다.
자료형 | 제로 값 |
숫자형 | 0 |
부울 | false |
문자형 | "" |
포인터 | nil |
포인터
- 포인터란, 변수의 메모리 주소를 저장하는 또 다른 변수다. 변수의 값을 복사하지 않고 메모리에 있는 실제 값을 참조할 수 있다.
- 포인터는 자료형 앞에 * 연산자를 붙여 선언한다. int형의 포인터는 아래와 같이 선언할 수 있다.
var iptr = *int
- 포인터의 제로 값은 nil이다. nil은 자바의 null과 비슷하며 nil 포인터를 참조하면 에러가 발생한다.
// int형 변수 초기화
var x int = 812
// x의 메모리 주소를 가리ㅣ는 포인터 선언
var xptr = &x
// 역참조
y := *xptr
- & 연산자는 x의 주소를 의미한다. 변수 앞에 & 연산자를 붙이면 행당 변수의 메모리 주소를 반환한다.
- 포인터가 가리키는 주소에 저장된 값을 얻는 행위를 역참조(de-referencing)라고 한다.
- 포인터가 가리키는 값을 바꿀 때도 다음과 같이 역참조를 사용한다.
*xptr = 12
- go의 포인터의 경우 c와 c++의 포인터와는 달리 포인터 연산을 지원하지 않는다. unsafe 패키지를 사용하면 가능하지만, 추천되는 방법은 아니다.
'go' 카테고리의 다른 글
go lang 기본기 다지기2 - 함수와 클로저 (0) | 2021.01.31 |
---|