함수는 여러 문장을 묶어서 실행하는 코드 블럭의 단위를 의미한다.
package main
// func + 함수명 + (파라미터 파라미터 타입) {}
func main() {
msg := "Hello"
// Hello 문자열이 복사되어 say()에 전달된다.
// pass by value
say(msg)
}
// 호출 될 때보다 늦게 선언되어도 괜찮다.
func say(msg string) {
println(msg)
}
package main
func main() {
total := sum(1, 7, 3, 5, 9)
println(total)
}
// 리턴 될 값이 int임을 명시한다.
func sum(nums ...int) int {
s := 0
for _, n := range nums {
s += n
}
// int 타입 값인 s를 리턴한다.
return s
}
package main
func main() {
msg := "Hello"
// msg 변수의 주소 표시 (값 복사가 아니고 주소만 전달한다)
say(&msg)
println(msg) //변경된 메시지 출력
}
// *를 붙여 파라미터가 포인터임을 표시한다.
func say(msg *string) {
// msg는 문자열을 갖는 메모리 영역의 주소를 갖게 된다.
println(*msg)
// *msg를 붙여 msg 주소의 메모리 영역의 데이터를 Changed로 변경한다.
// = Deferencing
*msg = "Changed" //메시지 변경
}
동일 타입 불특정 다수의 파라미터를 전달할 때 이를 받아들이는 함수를 가변 인자 함수라고 한다.
package main
func main() {
say("This", "is", "a", "book")
say("Hi")
}
// msg 스트링은 1개에서 n개까지 전달할 수 있다.
func say(msg ...string) {
for _, s := range msg {
println(s)
}
}
package main
func main() {
count, total := sum(1, 7, 3, 5, 9)
println(count, total)
}
// int 값 두 개를 리턴하기 위해 뒤에 (int, int)로 명시했다.
func sum(nums ...int) (int, int) {
s := 0 // 합계
count := 0 // 요소 갯수
for _, n := range nums {
s += n
count++
}
return count, s
}
// return 될 파라미터 명을 명시해 코드 가독성이 좋아진다.
func sum(nums ...int) (count int, total int) {
for _, n := range nums {
total += n
}
count = len(nums)
// return 되는 값이 있을 경우 리턴 될 파라미터를 따로 명시하지 않아도 return을 넣어야 한다.
return
}
함수 명을 갖지 않는 함수를 익명 함수라고 한다. 함수 전체를 변수에 할당하거나 다른 함수의 파라미터에 직접 정의되어 사용될 때 쓰인다.
익명 함수가 변수에 할당된 후에는 변수 명이 함수 명과 같이 취급되어 변수명(파라미터)형식으로 함수를 호출할 수 있다.
package main
func main() {
sum := func(n ...int) int { //익명함수 정의 (이름 생략되어 있음)
s := 0
for _, i := range n {
s += i
}
return s
}
result := sum(1, 2, 3, 4, 5) // 변수 sum에 할당된 익명함수 호출
println(result)
}
일급 함수는 어떤 언어에서 함수를 다른 변수와 동일하게 다룰 때 그 언어는 일급 함수를 가졌다고 표현한다. 함수를 다른 함수에 인수로 제공하거나, 함수가 함수를 반환하거나, 변수에 함수를 할당할 수 있다.
package main
func main() {
//변수 add 에 익명함수 할당
add := func(i int, j int) int {
return i + j
}
// add 함수 전달
r1 := calc(add, 10, 20)
println(r1)
// 직접 첫번째 파라미터에 익명함수를 정의함
r2 := calc(func(x int, y int) int { return x - y }, 10, 20)
println(r2)
}
func calc(f func(int, int) int, a int, b int) int {
result := f(a, b)
return result // 함수 리턴
}
type은 구조체, 인터페이스 등 custom type을 정의하기 위해 사용된다. 이는 함수 원형을 정의하는데 사용될 수 있다.
// 원형 정의
type calculator func(int, int) int
// calculator 원형 사용
func calc(f calculator, a int, b int) int {
result := f(a, b)
return result
}
함수 원형을 정의하고 함수를 타 메서드에 전달하고 리턴 받는 기능을 델리게이트라고 부른다.