map의 경우 그냥 단순히 아래의 코드처럼 사용하면 에러가 발생한다.
func main(){
var map map[string]string
map["hello"] = "HELLO"
}
map은 초기화가 필요하기 때문에 에러가 발생한다.
func main(){
//해결방법1
var map = map[string]string{}
//해결방법2
var map = make(map[string]string)
map["hello"] = "HELLO"
}
위와 같이 {}를 붙여서 초기화된 map을 변수로 할당하는 방법과, make()함수(map을 만들어주는 함수)를 사용해주는 방법이 있다.
매우 중요한 개념으로, 프로그램을 더욱 빠르고 멋지게 만들어주는 방법이다.
파이썬에서 많이 보아왔듯, 코드를 한번에 한 줄만 실행하지만, GO에서는 같이 동시에 실행할 수 있다.
단순히 실행할 함수 앞에 go만 붙여주는 것으로 수행할 수 있다. 주의할 점도 있다.
main function이 살아있는 동안만 go-routine이 유지된다.
Go-routine을 통해서 여러개의 함수를 동시에 실행할 때, 어떻게 응답을 받을 것인가? 이는 channel을 통해서 가능하다.
Channel은 손쉽게 만들 수 있다.
channel := make(chan type)
위와 같이 손쉽게 만들 수 있고, type을 적어주는 것으로 어떤 종료의 응답을 받을지도 명확하게 해줄 수 있다.
또한 go는 매우 똑똑해서, go 루틴을 생성한 개수를 알고 있어서 그 이상의 응답을 channel을 통해 기다리게 하면 컴파일시 에러를 잡아낸다.
func main() {
c := make(chan string)
people := [6]string{"sol", "da", "ho", "chan", "jeon", "sik"}
for _, person := range people {
go issexy(person, c)
}
fmt.Println("waiting for messages")
for i := 0; i < len(people); i++ {
fmt.Println(<-c)
}
}
func issexy(person string, channel chan string) {
time.Sleep(time.Second * 5)
channel <- person + " is sexy"
}
channel을 향해 data를 보낼때는 <- 를 이용하면 되고, channel은 어떤 data를 받을지, 어떤 data를 보내줄지 전부 명시해줘야 한다.
channel이 어떤 data를 받아야 함을 적어주면 이 구문은 blocking operation으로 작동한다. 반드시 응답을 받을때까지 main 함수가 기다리게 된다.
defer는 함수에서 작성하고 명령을 입력해주면, 해당 함수의 종료시에 그 명령을 수행합니다.
기본적인 문법은 대충 이정도로만 정리하고, 나머지는 따로 조금씩 정리해서 업로드 하도록 할 예정이다.