#go

Setup

1
2
3
4
vi ~/.bash_profile
export GOPATH = /Users/_username/Desktop/git/_projectName
echo $GOPATH # 고패스 확인
source ~/.bash_profile

Type

type assertion

1
variable.(type)

Goland

Gland 자동 copy right

Preferences - Editor - File and Code Templates - Files 탭에서 Go File 클릭 - package ${GO_PACKAGE_NAME} 앞에 copyright 주석을 추가하시면 됩니다!

Installation

윈도우
https://github.com/golang/dep/releases

위 링크를 통해 설치를 진행한 뒤 해당 .exe 파일을 go rootpath의 bin 폴더 안에 넣어준다.

프로젝트 폴더 포팅

dep을 사용하기 위해서는 반드시 다음과 같은 구조로 폴더를 만들고 포팅해야 한다.
GOPATH/src/github.com/directory/projectname

download

1
dep ensure

참조

설치하기

Go 는 패키지 매니저가 없으며 VCS에서 직접 받아와서 라이브러리를 사용합니다.

먼저, 다음 페이지에서 window 용 Go 를 설치해줍니다.

공식 다운로드 사이트

설치가 완료 되었다면. 아래와 같은 구조로 디렉터리를 만들어 줍니다.

1
2
3
4
Go/
bin/
pkg/
src/

main.go 만들기

main.go

1
2
3
4
5
6
7
8
9
10
11
package main //namespace declaration 하는 부분으로 기능과 논리들을 그룹화시켜준다.

import "fmt" // format의 약자로 standard lib에 있다.

// 여기서 main 은 keyword 로써 해당 함수가 라이브러리가 아닌 어플리케이션으로 동작함을 나타낸다.
// go 어플리케이션이 여기서 시작된다.
// func는 function을 선언하는 keyword 이다.
func main() {
fmt.Println("Hello, World") //여기서 println의 앞의 P가 대문자 인데, 이는 외부 라이브러리에서 가져왔음을 의미한다.
// 같은 원리로 함수를 선언할때 대문자로 시작하면 외부에서 접근이 가능한 것이다.
}

실행하기

1
go run main.go

빌드하기

1
2
3
4
5
6
go build # 실행가능한 binary 파일을 만들어 준다.
이 경우 파일명이 아니라 폴더 명으로 파일이 생성된다.
./go-study

윈도우용 빌드
GOOS=windows go build -o main.exe main.go

슬라이스

슬라이스는 배열의 값을 가리킵니다(point). 그리고 배열의 길이를 가지고 있습니다.

[]T 는 타입 T 를 가지는 요소의 슬라이스(slice) 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"

func main() {
p := []int{2, 3, 5, 7, 11, 13}
fmt.Println("p ==", p)

for i := 0; i < len(p); i++ {
fmt.Printf("p[%d] == %d\n",
i, p[i])
}
}

레인지

for 반복문에서 range 를 사용하면 슬라이스나 맵을 순회(iterates)할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
package main

import "fmt"

var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
}

_ 를 이용해서 인덱스(index)나 값(value)를 무시할 수 있습니다.

만약 인덱스만 필요하다면 “ , value ” 부분을 다 제거하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import "fmt"

func main() {
pow := make([]int, 10)
for i := range pow {
pow[i] = 1 << uint(i)
}
for _, value := range pow {
fmt.Printf("%d\n", value)
}
}

맵은 값에 키를 지정합니다.

맵은 반드시 사용하기 전에 make 를 명시해야합니다. (주의: new 가 아닙니다)

make 를 수행하지 않은 nil 에는 값을 할당할 수 없습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import "fmt"

type Vertex struct {
Lat, Long float64
}

var m map[string]Vertex

func main() {
m = make(map[string]Vertex)
m["Bell Labs"] = Vertex{
40.68433, -74.39967,
}
fmt.Println(m["Bell Labs"])
}

맵 리터럴 (Map literals)
맵 리터럴은 구조체 리터럴과 비슷하지만 key 를 반드시 지정해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import "fmt"

type Vertex struct {
Lat, Long float64
}

var m = map[string]Vertex{
"Bell Labs": Vertex{
40.68433, -74.39967,
},
"Google": Vertex{
37.42202, -122.08408,
},
}

func main() {
fmt.Println(m)
}

다양한 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import "fmt"

func main() {
m := make(map[string]int)

m["Answer"] = 42
fmt.Println("The value:", m["Answer"])

m["Answer"] = 48
fmt.Println("The value:", m["Answer"])

delete(m, "Answer")
fmt.Println("The value:", m["Answer"])

v, ok := m["Answer"]
fmt.Println("The value:", v, "Present?", ok)
}

switch

다른 일반적인 언어를 아는 분이라면 switch 에 대해서 잘 알 것입니다.

다른 언어와 다른점은 case의 코드 실행을 마치면 알아서 break를 한다는 점입니다.

( fallthrough 로 끝나는 case는 스스로 break를 하지 않습니다 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import (
"fmt"
"runtime"
)

func main() {
fmt.Print("Go runs on ")
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.", os)
}
}

메소드

고에는 클래스가 없습니다. 하지만 메소드를 구조체(struct)에 붙일 수 있습니다.

메소드 리시버(method receiver) 는 func 키워드와 메소드의 이름 사이에 인자로 들어갑니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
"fmt"
"math"
)

type Vertex struct {
X, Y float64
}

func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
v := &Vertex{3, 4}
fmt.Println(v.Abs())
}

인터페이스

인터페이스는 메소드의 집합으로 정의됩니다.

그 메소드들의 구현되어 있는 타입의 값은 모두 인터페이스 타입의 값이 될 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main

import (
"fmt"
"math"
)

type Abser interface {
Abs() float64
}

func main() {
var a Abser
f := MyFloat(-math.Sqrt2)
v := Vertex{3, 4}

a = f // a MyFloat implements Abser
a = &v // a *Vertex implements Abser
a = v // a Vertex, does NOT
// implement Abser

fmt.Println(a.Abs())
}

type MyFloat float64

func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}

type Vertex struct {
X, Y float64
}

func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×