1. 함수
- Go에서 함수는 func 키워드와 함수명을 사용해서 정의한다.
- Java의 메소드와 비슷하다.
- 함수명 뒤에 괄호 안에 받을 파라미터를 적는데, 파라미터명 + 타입 순서로 적어준다.
func main() {
msg := "Hello"
say(msg)
}
func say(msg string) {
println(msg)
}
- msg에 "Hello"를 담아 say함수에 전달했고, say함수에서 msg(string)로 받아서 출력했다.
2. 파라미터 전달 방식
- Go에서 파라미터를 전달하는 방식은 Pass By Value와 Pass By Reference로 나뉜다.
(1) Pass By Value
위의 [1. 함수]의 예제에서는 msg의 값 "Hello" 문자열이 복사되어 함수 say()에 전달된다. 즉, 만약 파라미터 msg의 값이 say() 함수 내에서 변경된다하더라도 호출함수 main()에서의 msg 변수는 변함이 없다.
(2) Pass By Reference
아래의 예제에서처럼 msg 변수앞에 & 부호를 붙이면 msg 변수의 주소를 표시하게 된다. 흔히 포인터라 불리우는 이 용법을 사용하면 함수에 msg 변수의 값을 복사하지 않고 msg 변수의 주소를 전달하게 된다. 피호출 함수 say()에서는 *string 과 같이 파라미터가 포인터임을 표시하고 이때 say 함수의 msg는 문자열이 아니라 문자열을 갖는 메모리 영역의 주소를 갖게 된다. msg 주소에 데이타를 쓰기 위해서는 *msg = "" 과 같이 앞에 *를 붙이는데 이를 흔히 Dereferencing 이라 한다.
func main() {
msg := "Hello"
say(&msg)
println(msg) //변경된 메시지 출력
}
func say(msg *string) {
println(*msg)
*msg = "Changed" //메시지 변경
}
- Pass By Reference 방식은 내가 개발할 때 사용해 본적이 없다. 이번에 공부하면서 알게 된 방식.
3. 가변인자함수
- 함수에 고정된 수의 파라미터들을 전달하지 않고 다양한 숫자의 파라미터를 전달하고자 할 때 가변 파라미터를 나타내는 ... (3개의 마침표)을 사용.
func main() {
say("This", "is", "a", "book")
say("Hi")
}
func say(msg ...string) {
for _, s := range msg {
println(s)
// this
// is
// a
// book
// Hi
}
}
4. 함수 리턴값
- Go는 함수 리턴값을 여러 개를 할 수 있다.
- 리턴값 타입은 파라미터 괄호 뒤에 적어준다.
- 리턴 변수명을 파라미터 괄호 뒤에 같이 적어서 바로 리턴이 가능하다.
func main() {
total := sum(1, 7, 3, 5, 9)
println(total)
}
func sum(nums ...int) int {
s := 0
for _, n := range nums {
s += n
}
return s
}
// 리턴값 여러 개
func main() {
count, total := sum(1, 7, 3, 5, 9)
println(count, total)
}
func sum(nums ...int) (int, int) {
s := 0 // 합계
count := 0 // 요소 갯수
for _, n := range nums {
s += n
count++
}
return count, s
}
// Named Return Parameter들에 리턴값들을 할당하여 리턴
func sum(nums ...int) (count int, total int) {
for _, n := range nums {
total += n
}
count = len(nums)
return
}
참고 사이트
'개발 > Go' 카테고리의 다른 글
[Go] 기초 - 클로저 (Closure) (0) | 2022.07.19 |
---|---|
[Go] 기초 - 익명함수 (0) | 2022.07.18 |
[Go] 기초 - 반복문 (0) | 2022.07.17 |
[Go] 기초 - 조건문 (0) | 2022.07.15 |
[Go] 기초 - 연산자 (0) | 2022.07.13 |