Golang2

솔다·2023년 1월 25일
0

map 초기화

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을 만들어주는 함수)를 사용해주는 방법이 있다.

Goroutines

매우 중요한 개념으로, 프로그램을 더욱 빠르고 멋지게 만들어주는 방법이다.

파이썬에서 많이 보아왔듯, 코드를 한번에 한 줄만 실행하지만, GO에서는 같이 동시에 실행할 수 있다.

단순히 실행할 함수 앞에 go만 붙여주는 것으로 수행할 수 있다. 주의할 점도 있다.

main function이 살아있는 동안만 go-routine이 유지된다.

Go-routine을 통해서 여러개의 함수를 동시에 실행할 때, 어떻게 응답을 받을 것인가? 이는 channel을 통해서 가능하다.

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

defer는 함수에서 작성하고 명령을 입력해주면, 해당 함수의 종료시에 그 명령을 수행합니다.

기본적인 문법은 대충 이정도로만 정리하고, 나머지는 따로 조금씩 정리해서 업로드 하도록 할 예정이다.

0개의 댓글