함수는 여러 문장을 한번에 실행할 수 있도록 하는 코드 묶음이다.
기본적으로 func 함수명(parameters) {...} 형태를 갖춘다.
c와는 다르게 파라미터를 적을 때 파라미터명 뒤에 데이터 타입을 작성한다.
func hi(name string) {
println("hi", name)
}
파라미터를 작성할 때 Pass by Value와 Pass by Reference 2가지 방법이 있다.
Pass by Value 는 파라미터의 값만 활용하여 파라미터 원본을 복사하여 사본을 활용한다고 생각하면 된다.
Pass by Reference 는 파라미터 원본을 가져다 활용한다.
아래 두 예제에서 각각 Pass by Value와 Pass by Reference를 활용하였다.
package main
func main() {
name := "Tom"
hi(name)
println(name)
}
func hi(name string) {
println("hi", name)
name = "Sam"
}
위 예제에서는 값을 복사하여 사본을 활용하기 때문에 hi 함수에서 name의 값을 변경하였지만 사본의 값을 변경했기에 원본인 main 함수의 name의 값은 바뀌지 않는다.
package main
func main() {
name := "Tom"
hi(&name)
println(name)
}
func hi(name *string) {
println("hi", *name)
*name = "Sam"
}
Pass by Reference는 원본을 그대로 활용하기 때문에 hi 함수 안에서 바꾼 name 값이 main 함수 안에서도 바뀐 것을 확인할 수 있다.
함수 리턴 값을 다루기 위해서는 parameter 괄호와 { 사이에 반환하려는 값의 데이터 타입을 적어주면 된다.
func add(a int, b int) int {
return a + b
}
여러 값들을 리턴하고 싶다면 리턴하려는 데이터 타입을 나열하여 적으면 된다.
func add(a int, b int) (int, string) {
return a + b, "done"
}
리턴 값을 적는 또 하나의 방법이 있다.
바로 리턴하려는 변수 명을 데이터 타입 앞에 적는 방법이다.
func add(a int, b int) (c int) {
c = a + b
return
}
리턴하려는 값이 c라고 미리 선언하고 c 값을 변경하면 된다. 리턴하는 값을 return 뒤에 나열하지 않더라도 return을 쓰지 않으면 에러가 발생한다.
리턴하는 값을 한눈에 알 수 있다는 장점이 있다.