컴파일이 필요하면 반드시 main.go가 있어야 함
반대로 컴파일이 필요 없다면 main.go는 없어도 무관
코드 본문에 패키지를 사용하면 자동으로 import에 들어감.
npm, pypi처럼 통합된 저장소가 없어서 url을 통해 외부 모듈을 다운받음
다운받은 소스는 src 폴더에 저장되어, import 할 때는 그 경로를 입력
변수는 const/var로 나눌 수 있음
const 값은 변경할 수 없으므로 구분해서 써야함
const name1 string = "name1"
var name2 string = "name2"
그런데 매번 const/var 와 타입을 써 주는것은 귀찮으므로
함수 안에서 변수를 초기화 할 때는
func main () {
name1 := "name1"
name1 = "name2"
}
으로 설정하면 알아서 타입을 지정해준다.
다만 이미 선언된 변수의 값을 변경할 때는 그냥 변수 = 값만 해도 된다.
함수를 작성할 때도 타입은 반드시 설정해야 하는데, 인자의 타입과 리턴 타입을 모두 설정해야 한다.
func multiply(a, b int) int {
return a * b
}
인자가 2개 이상이고 모두 같은 타입일 때는 끝에 한 번만 써도 된다.
리턴 타입은 인자 다음에 써 주는데 go의 특징으로는 리턴값이 여러개일 수 있다.
따라서 리턴이 여러개일 경우, 리턴 타입도 마찬가지로 (int, string)과 같이 여러개를 지정해줘야 하며, 리턴 값의 순서도 이에 맞춰 작성해야 한다.
func lenAndUpper(name string) (int, string) {
return len(name), strings.ToUpper(name)
}
인자의 개수가 여러개인데 몇 개가 들어올지 모른다면 다음과 같이 인자로 ...을 주면 된다.
func repeatMe(words ...string) {
fmt.Println(words)
}
func main() {
repeatMe("nico", "lynn", "dal", "marl", "flynn")
}
>> ["nico" "lynn" "dal" "marl" "flynn"]
go의 특이한 기능 중 하나인 defer는 함수가 끝난 다음에 실행될 내용을 정할 수 있는 기능.
func lenAndUpper(name string) (length int, uppercase string) {
defer fmt.Println("Done")
length = len(name)
uppercase = strings.ToUpper(name)
return
}
func main() {
totalLength, upperName := lenAndUpper("nico")
fmt.Println(totalLength, upperName)
}
>> Done
>> 4 NICO