gogo
gogo copied to clipboard
252페이지 클로저를 이용한 생성기 문의드립니다.
p.252 콜백 함수를 받아서 동작하게 만든다면 위의 방법과 거의 동일하게 구현이 가능합니다.
라고 설명해주셨는데, 콜백을 이용해서 어떻게 구현해야할지 모르겠습니다.
클로저를 이용하려면 함수를 리턴하는 패턴일거고, 리턴 되는 함수와 매칭된 변수들이 있어서 그 변수들을 이용해야 할거라고 예측은 됩니다. 리턴된 함수를 콜 할 때마다 알맞는 결과가 한 번씩 반환되어야 할거라고 생각되는데요. 아래처럼 작성해봤는데, 예쁘지 않아서 마음에 들지 않습니다. 좋은 방법을 알려주세요.
func BabyNamesGenerator(first, second string) func() string {
len_first := len([]rune(first))
len_second := len([]rune(second))
next, i, j := 0, 0, 0
return func() string {
if next == len_first*len_second {
return ""
}
name := string([]rune(first)[i]) + string([]rune(second)[j])
next++
j++
i = j / len_second
j = j % len_second
return name
}
}
func Example_BabyNamesGenerator() {
get_names := BabyNamesGenerator("성정명재경", "준호우훈진")
for name := get_names(); name != ""; name = get_names() {
fmt.Print(name, ",")
}
// Output:
// 성준,성호,성우,성훈,성진,정준,정호,정우,정훈,정진,명준,명호,명우,명훈,명진,재준,재호,재우,재훈,재진,경준,경호,경우,경훈,경진,
}
안녕하세요. 꼼꼼하게 읽으시고 코드 작성해 보시고 유용하게 책을 이용해 주셔서 감사합니다. 저도 몇 년 전의 제가 아니기에 그 부분을 다시 찾아 봤습니다. 그 부분을 볼 때 제 머리 속에 떠 오르는 방법은 함수를 리턴하는 게 아니라 넘겨 주는 방식입니다. 리턴하는 방법으로는 좋은 모양이 안 나올 거 같습니다.
https://play.golang.org/p/FhSuGvSYCMv
package main
import "fmt"
func BabyNamesGenerator(first, second string, cb func(name string)) {
for _, f := range first {
for _, s := range second {
cb(string(f) + string(s))
}
}
}
func ExampleBabyNamesGenerator_print() {
BabyNamesGenerator("성정명재경", "준호우훈진", func(name string) {
fmt.Print(name, ",")
})
// Output:
// 성준,성호,성우,성훈,성진,정준,정호,정우,정훈,정진,명준,명호,명우,명훈,명진,재준,재호,재우,재훈,재진,경준,경호,경우,경훈,경진,
}
func ExampleBabyNamesGenerator_slice() {
var names []string
BabyNamesGenerator("성정명재경", "준호우훈진", func(name string) {
names = append(names, name)
})
fmt.Println(names)
// Output:
// [성준 성호 성우 성훈 성진 정준 정호 정우 정훈 정진 명준 명호 명우 명훈 명진 재준 재호 재우 재훈 재진 경준 경호 경우 경훈 경진]
}
바로 출력도 되지만 슬라이스에 담는다던지 원하는 다른 다양한 처리를 해 줄 수 있죠. 이것은 마음에 드시나요?
바로 답변을 달아주셔서 고맙습니다.
코드가 깔끔해져서 마음에 듭니다. ExampleBabyNamesGenerator_print()에서는 클로저가 생기는 부분은 없고, ExampleBabyNamesGenerator_slice()에서는 names 변수 때문에 클로저가 생기는거죠?
여담으로 디스커버리 Go 언어 책은 얇으면서도 알차고 재밌습니다. 또다른 염재현님의 책을 기대합니다. Yes24에서 저자명으로 검색해보면 1권만 나와서 아쉽습니다.
네. 맞습니다. 도움이 되셨다니 기쁘네요. 책은 언제 또 쓸 수 있을지 모르겠네요...