golang 기초
juneyr··
Golang 기초 문법 공부하기
자료형
bool
string
int int8 int16 int32 int64
uint uint8 uint32 uint64 uintptr
byte // uint8 의 다른 이름
rune // int32의 다른 이름, 유니코드 코드 포인트 값을 표현합니다
float32 float64
complex64 complex 128
변수 선언
var
함수 선언
반복문
조건문
if 문
if 문에서 짧은 명령문 사용하기
구조체
포인터
포인터가 있지만 포인터 연산은 불가능하다.
new 함수
new(T) 는 모든 필드가 0인 T 타입 포인터를 반환한다.
t := new(T)
슬라이스(Slices)
슬라이스는 배열의 값을 가리키고, 배열의 길이를 가지고 있다.
파이썬 처럼 나눌 수도 있다.
슬라이스는 make 함수로 만들 수 있다.
var z []int 와 같은 슬라이스는 nil slice이고, 길이와 용량(최대크기)가 0이다.
range
For 와 range를 동시에 사용하면 슬라이스나 맵을 순회할 수 있습니다.
i나 v부분은 _ 로 무시해서 사용할 수 있다.
아예 필요 없다면 지워도 괜찮다.
Map
Key : value 타입, 반드시 make를 명시해야함.
맵 대표적인 예제: WordCount
package main
import (
"code.google.com/p/go-tour/wc"
"strings"
)
func WordCount(s string) map[string]int {
var res = make(map[string]int)
var arr = strings.Fields(s)
for _,v := range(arr){
var _, ok = res[v]
if ok {
res[v] += 1
}else{
res[v] = 1
}
}
return res
}
func main() {
wc.Test(WordCount)
}
Closure
함수를 반환할 수 있고(return 다음에 함수를 쓸수 있고) 함수를 넘길 수 있음
클로져는 연습이 되어야할 듯 ㅜ
Switch
일반적인 switch 문과 같지만 알아서 break함
위에서 아래로 평가해서, 조건이 참인 것을 찾으면 그 아래는 실행하지 않음
go에서는 조건을 생략할 수 있음 (switch만 사용, switch true 와 같음)
메소드와 인터페이스
메소드
고에는 클래스가 없다. 메소드를 구조체에 붙일 수 있음 ( 사실 어떤 type 이든 붙일 수 있음, 기본 타입이나 다른 패키지 타입이 아니라면)
왜 포인터 리시버를 썼는가
- 메소드 호출될 때마다 값이 복사되지 않게 하기 위해서
- 리시버 포인터가 가리키는 값을 수정하기 위해서(Write 작업을 하는 경우)
인터페이스
메소드의 집합! 메소드가 구현해놓은 type들은 모두 인터페이스 타입의 값이 될 수 있음 (말이 어려운데)
type Abser interface {
Abs() float64
}
func main(){
var a Abser
f := MyFloat(-math.Sqrt2)
v := Vertex{3,4}
a = f // 위에서 MyFloat 타입에 대하여 Abs()를 정의했으므로 사용 가능
a = &v // 위에서 *Vertext 타입에 대하여 Abs()를 정의했으므로 사용 가능
a = v // Vertext 타입에 대해 정의 하지 않아 a Vertex는 성립하지 않는다.
}
인터페이스의 메소드들을 구현하면 인터페이스들을 구현한 것이다.
에러
웹서버
이미지
image 패키지는 Image 인터페이스를 정의합니다.
참조 : image - The Go Programming Language
동시성 :goroutine
고루틴은 Go 런타임에 의해 관리되는 쓰레드입니다.
go f(x,y,z) 는 새로운 고 루틴을 시작시킵니다.
고루틴은 동일 주소 공간에서 시작되므로 공유 자원에 대한 접근은 sync 형태여야합니다.
동시성: Channel
채널은 채널 연산자(<-)를 이용해 값을 주고 받을 수 있는, 타입이 존재하는 파이프입니다.
송수신은 상대방이 준비될 때까지 있다 블록됩니다.
채널은 버퍼링 될 수 있습니다.
데이터 송신 측은 보낼 값이 없다는 걸 알리기 위해 채널을 닫을 수 있습니다.
close(c)
수신 측은 다음 코드로 채널의 열림 여부를 알 수 있습니다.
v, ok := <- ch
ok가 false인 경우 채널이 닫히고 받을 값이 없다는 뜻이 됩니다.
Select 구문
Select 구문은 고루틴이 다수의 통신 동작으로 부터 수행 준비를 기다릴 수 있게 합니다. select는 case 구문으로 받는 통신 동작 중 하나가 수행될때까지 진행을 블록합니다. 다수의 채널이 동시에 준비되면 그 중 무작위로 선택합니다.
default case
현재 수행 준비가 완료된 케이스가 없을 때 수행 블로킹 없이 async 송수신을 하고자 할때 default 케이스를 사용