영감을 (inspire) 주고픈 개발 블로그

[프로그래밍 언어] Go언어 문법적 특징을 보자! -2 본문

카테고리 없음

[프로그래밍 언어] Go언어 문법적 특징을 보자! -2

inspire12 2016. 9. 18. 23:26

Go의 특징 : http://inspire12.tistory.com/9

Go 문법 탐구 1 : http://inspire12.tistory.com/12

에 이어서


9. 함수 값, 함수는 값이자, 클로져


클로져는 

func adder() func(int) int {

    sum := 0

    return func(x int) int {

        sum += x

        return sum

    }

}

이것처럼 return에 func으로  선언이 가능하다는 것이다. 

10. 메소드, struct를 이용한다.


type MyFloat float64


func (f MyFloat) Abs() float64 {

    if f < 0 {

        return float64(-f)

    }

    return float64(f)

}



11. 인터페이스 (메소드 들의 집합)


type MyFloat float64


func (f MyFloat) Abs() float64 {

    if f < 0 {

        return float64(-f)

}

이런 식이다.

 

12. 에러

fmt 패키지의 다양한 출력 루틴들은 error 의 출력을 요청받았을 때 자동으로 이 메소드를 호출합니다.

(fmt 패키지에 에러처리용 출력도 저장 - 굉장히 실용적인거 같다.)


type error interface {
	Error() string
}

 ---심화되는 내용


12. 웹서버


웹 서버는 http.Handler 에서 request를 제공하는데 이를 이용한다. 개인적으로 JSP를 사용하면서 많이 익혔던 부분이다.

go lang은 시스템 프로그래밍으로 개발된 언어지만 웹앱에 발전으로 프래임웍 쪽에서 이슈받으니 해보는 게 좋을 것 같다.



12. 동시성!


Goroutines : Go 런타임에 의해 관리되는 경량 쓰레드, C 쓰레드와 비슷 

동일한 공간에서 실행되므로 자원접근은 반드시 동기화 되어야한다! (쓰레드 개념)

 

package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { go say("world") say("hello") }


13. 채널

Go lang의 가장 큰 장점이 아닌가 한다. 
채널 연산자인 <- 을 이용해 값을 주고 받을 수 있는 파이프(타입이 존재)


채널은 버퍼링이 될수 있습니다. 버퍼링이란 버퍼를 이용해서 전송을 한다는 겁니다.


package main import "fmt" func main() { c := make(chan int, 2) c <- 1 c <- 2 fmt.Println(<-c) fmt.Println(<-c) }

Range / Close

데이터 송신측은 더이상 보낼 값이 없다는 것을 알리기 위해 채널을 close 할 수 있습니다. 수신측은 다음과 같이 수신 코드에 두번째 인자를 줌으로써 채널이 닫혔는지 테스트 할 수 있다.

v, ok := <-ch

채널이 이미 닫혔고 더이상 받을 값이 없다면 ok 는 false 가 된다.

for i := range c 반복문은 채널이 닫힐 때까지 계속해서 값을 받는다.

주의: 송신측만 채널을 닫을 수 있습니다. 수신측에선 불가능. 이미 닫힌 채널에 데이터를 보내면 패닉이 일어납니다.

또하나의 주의: 채널은 파일과 다릅니다; 항상 닫을 필요는 없습니다. 채널을 닫는 행위는 오로지 수신측에게 더이상 보낼 값이 없다고 말해야 할때만 행해지면 됩니다. range 루프를 종료시켜야 할 때!