Go의 문법과 변수 표현식
Variable Expression
간결하고 명확함을 추구하는
GoLang의 문법,
변수 표현식,
Multi Return,
Naked Function,
defer에 대해 알아보겠습니다.
Go의 문법
Golang의 접근제한자입니다.
Java의 접근 제한자( public, private )를 함수의 첫 글자의 대소문자로 구분합니다.
Go는 JavaScript처럼 Export Default를 하지 않습니다.
또한 import에 선언만 하면 바로 사용할 수 있습니다.
먼저 example.go를 작성합니다.
package example
import "fmt"
func sayBye(){
fmt.PrintLn("Bye~")
}
func SayHello(){
fmt.PrintLn("Hello!")
}
첫 글자가 대문자인 SayHello인 함수는 import 후에 어디서나 호출 가능합니다.
하지만 소문자인 sayBye 함수는 예외를 발생시킵니다.
package main
import (
"fmt"
"example"
)
func main(){
// 메소드의 첫 글자가 대문자인 경우 Public 접근 제한자가 설정됩니다.
example.SayHello()
// 메소드의 첫 글자가 소문자인 경우 Private 접근 제한자가 설정됩니다.
// 따라서 예외가 발생됩니다.
example.sayBye()
}
또한, Go는 생성자 메서드를 직접 수동으로 만들어 주어야 합니다.
Java의 new Method();
JavaScript Class의 constructor()
Python의 __init__처럼 선언과 동시에 초기화를 하지만 Go에서는 필요한 경우 초기화하는 로직을 직접 작성해야 합니다.
변수와 상수
JavaScript의 var와 const의 개념과 유사합니다.
TypeScript처럼 변수 혹은 상수의 유형( Type )을 미리 선언할 수 있습니다.
다음 예제는 전역 변수, 지역 변수 둘 다 설정 가능합니다.
UnType
const c_name = "juwon"
var c_name2 = "juwon"
Type
const v_name string = "juwon"
var v_name2 string = "juwon"
Type 바인딩(축약형 선언)입니다. ( 지역변수로만 선언 가능합니다. )
name := "juwon" // string type으로 자동 바인딩
age := 1 // int type으로 자동 바인딩
함수 표현식
Go의 경우 리턴 타입을 매개변수 선언한 다음에 표기해줍니다.
Java
public int multiply(int a, int b){
return a * b;
}
Go
func Multiply(a, b int) int{
return a * b // Go의 컴파일러가 컴파일 시점에 자동으로 세미콜론( ; )을 붙여 줍니다.
}
Multi Return ( ignore variable )
// 반환 타입을 int 타입과 string 타입으로 선언
func lenAndUpper(name string)(int, string){
// len()과 strings.ToUpper는 go가 가지고 있는 내장 메소드입니다.
return len(name), strings.ToUpper(name)
}
func main(){
length, upperName := lenAndUpper("juwon")
fmt.PrintLn(length, uppercase)
// 이처럼 Java에는 없는 Multi Return이 가능합니다.
// 하지만 Multi Return 중 하나의 리턴값만 사용하고 싶을 경우
length, upperName := lenAndUpper("juwon")
// upperName을 선언만 했기 때문에 decalered but not used 예외가 발생합니다.
fmt.PrintLn(length)
// 이러한 경우 Go에서는 _ ( ignore variable)를 사용할 수 있습니다.
length, _ := lenAndUpper("juwon")
fmt.PrintLn(length) // _로 무시할 수 있습니다.
}
Naked Return ( 벌거벗은 반환값 )
Naked Return은 Go Compiler에게 미리 선언한 변수명과 변수의 타입으로 리턴한다는 것을 알려주고
컴파일하겠다는 뜻과 같습니다.
// naked return은 var length int, var uppercase string를 미리 선언하는 것과 같습니다.
func lenAndUpper(name string) (length int, uppercase string){
// naked return 구문에 의해 length := 생략됨
length = len(name)
uppercase = strings.ToUpper(name)
return
}
func main(){
totalLength, upperCase := lenAndUpper("juwon")
fmt.PrintLn(totalLength, upperCase)
}
defer
defer는 함수의 리턴 후에 실행할 수 있는 문법입니다.
func lenAndUpper(name string) (length int, uppercase string){
defer fmt.PrintLn("defer는 메소드의 Return 이후에 실행되는 구문입니다.")
length = len(name)
uppercase = strings.ToUpper(name)
return
}
func main(){
totalLength, upperCase := lenAndUpper("juwon")
fmt.PrintLn(totalLength, upperCase)
}
GoLang의 기본 문법과 표현에 대해 알아보았습니다.