funcmain() { minusSample2, err := sample1(1, 5) // err test
if err == nil { fmt.Println(minusSample2) } else { log.Print(err.Error()) // 2019/02/16 15:19:51 first is small then second } }
funcsample1(first int, second int)(int, error) { if first >= second { return first - second, nil } else { return0, errors.New("first is small then second") } }
예외 처리
go에는 try/catch가 업다.
go에서는 에러가 나면 내장되잇는 panic() 함수가 호출이 된다. 그러면 실행하는 함수에서 멈추고
종료된다. recover()라는 내장 함수를 호출 하면 panic 상태를 다시 정상으로 롤백 함.
for index := 0; index < 3; index++ { select { case msg1 := <-c1: fmt.Println("1번 말 도착", msg1) case msg2 := <-c2: fmt.Println("2번 말 도착", msg2) case msg3 := <-c3: fmt.Println("3번 말 도착", msg3) } } }
각각 채널을 생성하고 각각의 고루틴에서 쓰인다고 가정하자. (위의 처럼)
이제 반복문에서 select를 통해 각각의 고루틴에서 할당한 채널을 모두 읽게 된다.
위의 경우에 일정 딜레이를 주었지만 생략하거나 중간에 종료되지 않는다. 대기했다가 수신한다.
CPU
Go도 기본적으로 cpu를 1개만 쓴다. 모든 cpu를 활용하려면 아래와 같이 해야 함.
1 2 3 4 5 6 7 8 9 10
package main
import"runtime"
funcmain() { thisComputerCPU := runtime.NumCPU() // 현재 컴의 시피유 개수를 구하는 내장 함수. fmt.Println("CPU 개수:", thisComputerCPU) // 로컬은 인텔 i5인데 4개 나온다 나중에 AWS에서 테스트해보자.
runtime.GOMAXPROCS(thisComputerCPU) // 현재 컴의 시피유를 다 쓰겟다는 거. }