본문 바로가기

Programming Language/golang

Golang의 독특한 특징 3가지 - A declared are not used, Multiple return values, Timeout

기존 java 개발에서는 볼 수 없었던 독특한 golang만의 특징 몇가지를 소개하고자 한다.

 

- 아래 내용들은 Jetbrains사의 GoLand IDE를 사용하였습니다. 

- Jetbrains사의 GoLand IDE사용하여 Golang 실행하기 포스트 바로가기

A declared are not used

- Golang은 variable을 선언해놓고 쓰지 않으면 compile이 불가하다.

 

 

 

Multiple return values

- Java에서는(적어도 java 8 이전) 1개의 method 혹은 function에 대해서 return은 1개의 값만 가능하다.

private int sum(int a, int b){
    return a + b;
}
private int multiple(int a, int b){
    return a * b;
}
 

 

 

- Golang에서는 2개 이상의 multiple return에 대해서 지원한다.

package main

import (
    "fmt"
)

func sumAndMultiply(a int, b int) (int, int) {
    return a + b, a * b
}

func main() {

    sum, multiply := sumAndMultiply(4,5)
    fmt.Println("sum : ",sum)
    fmt.Println("multiply : ",multiply)
}

 

 

- Golang에서 multiple return을 지원하더라도, 사용하지 않는 값이라면 아래와 같이 사용안하는 것을 under bar(_)로 명시적으로 선언이 가능하다.

 

- 아래와 같이 명시적으로 선언하지 않고, multiple return value를 받고 사용하지 않는다면 A declared are not used 오류가 뜰 것이다.

package main

import (
    "fmt"
)

func sumAndMultiply(a int, b int) (int, int) {
    return a + b, a * b
}

func main() {

    _, multiply := sumAndMultiply(4,5)
    fmt.Println("multiply : ",multiply)
}

 

 

 

 

Timeout

- Timeout은 외부 통신 혹은 외부 자원을 사용할때 적용할 수 있는 중요한 개념이다.

- Golang에서의 timeout은 channel과 select라는 개념을 사용하여 간단하면서도 강력하게 적용가능하다.

 

- Channels are the pipes that connect concurrent goroutines.
(Groutine이란 Golang의 경량 thread execution이다.)

- Select lets you wait on multiple channel opertations.

 
아래 코드를 찬찬히 살펴보자
package main

import "time"
import "fmt"

func main() {

    c1 := make(chan string, 1) // string 1개 버퍼를 가지는 channel 생성
    go func() {
        time.Sleep(2 * time.Second) // 2초가 걸린 뒤 c1에 "result 1"을 전송
        c1 <- "result 1"
    }() // function생성과 함께 바로 goroutine 실행됨)

    select {
        case res := <-c1:
            fmt.Println(res)
        case <-time.After(1 * time.Second): // 1초의 timeout 생성
            fmt.Println("timeout 1")
    }


    c2 := make(chan string, 1)
    go func() {
        time.Sleep(2 * time.Second) // 2초가 걸린 뒤 c1에 "result 1"을 전송
        c2 <- "result 2"
    }() // function생성과 함께 바로 goroutine 실행됨)

    select {
        case res := <-c2:
            fmt.Println(res)
        case <-time.After(3 * time.Second): // 3초의 timeout 생성
            fmt.Println("timeout 2")
    }
}
 
 

Golang의 Timeout을 사용한 결과물

- Golang의 timeout을 사용하면 외부 통신에 대해서 유연하게 대체 가능하다. 

- Golang을 사용하여 Http get 통신 timeout 구현 포스트 바로가기

 

 

참고사이트 : gobyexample.com 사이트

 

End of Document