2024.03.19
func div(numerator int, denominator int) int {
if denominator == 0 {
return 0
}
return numerator / denominator
}
type MyFuncOpts sturct {
FirstName string
LastName string
Age int
}
func MyFunc(opts MyFuncOpts) error {
// do something
}
func main() {
MyFunc(MyFuncOpts {
LastName: "Patel",
Age: 50,
})
MyFunc(MyFuncOpts {
FirstName: "Joe",
LastName: "Smith",
})
}
…
)을 붙인다.func addTo(base int, vales ...int) []int {
out := make([]int, 0., len(vals))
for _, v := range vals {
out = append(out, base+v)
}
return out
}
// 아래와 같이 여러 가지 방법으로 호출할 수 있다.
// addTo(3)
// addTo(3, 2)
// addTo(3, 2, 4 ,6)
// addTo(3, []int{1, 2, 3, 4, 5})
func divAndRemainder(numerator int, denominator int) (int, int, error) {
if denominator == 0 {
return 0, 0, erros.New("Cannot divide by zero")
}
return numerator / denominator, numerator % denominator, nil
}
// result, remainder, err := divAndRemainder(10 , 2)
_
라는 이름의 변수로 할당하게 하면 된다.result, _ = divAndRemainder(10 , 2)
divAndRemainder(10 , 2)
func
와 파라미터 타입 및 반환값으로 구성된다. 이 조합을 함수 시그니처라 부른다.type
키워드를 사용한 것과 같이, 함수 타입을 정의하는데도 사용할 수 있다.type opFuncType func(int,int) int
func main(){
for i := 0; i< 5; i++ {
func(j int) {
fmt.Println("printing", j, "from inside of anonymous function")
}(i)
}
}
defer
문과 고루틴을 사용할 때 선언된 익명 함수를 변수에 할당없이 사용하면 유용하다.type Person struct {
FirstName string
LastName string
Age int
}
people := []Person{
{"Pat", "Patterson", 37},
{"Tracy", "Bobbert", 23},
{"Fred", "Fredson", 18},
}
// 성으로 정렬
sort.Slice(people, func(i int, j int) bool {
return people[i].LastName < poeple[j].LastName
})
// 나이로 정렬
sort.Slice(people, func(i int, j int) bool {
return people[i].Age < poeple[j].Age
})
func makeMult(base int) func(int) int {
return func(factor int) int {
return base * factor
}
}
func main() {
twoBase := makeMult(2)
threeBase := makeMult(3)
for i := 0; i < 3; i++ {
fmt.Println(towBase(i), threeBase(i))
}
}
defer
키워드가 붙은 함수에 들어가게 된다.func main() {
if len(os.Args) < 2 {
log.Fatal("no file specified")
}
f, err := os.Open(os.Args[1])
if err != nil {
log.Fatal(err)
}
defer f.Close()
// 유효한 파일 핸들을 얻고나서, 파일을 사용하고 함수가 어떤 식으로 종료되었던 간에 닫아줘야 한다.
_data := make([]byte, 2048)
for {
count, err := f.Read(data)
os.Stdout.Write(data[:count])
if err != nil {
if err != io.EOF {
log.Fatal(err)
}
break
}
}
}
defer
키워드와 함수나 메서드 호출을 바로 사용한다.defer
는 호출하는 함수를 둘러싼 함수가 종료될 때까지 수행을 연기한다.defer
는 Go 함수에서 여러 클로저를 지연시킬 수 있다. 후입선출의 순서로 실행된다.defer
로 등록된 것이 가장 먼저 실행된다.func getFile(name string) (*os.File, func(), error) {
file, err := os.Open(name)
if err != nil {
return nil, nil, err
}
return file, func() {
file.Close()
}, err
}
// 위 헬퍼 함수는 파일, 함수 그리고 오류를 반환한다.
func main() {
f, closer, err := getFile(os.Args[1])
if err != nil {
log.Fatal(err)
}
defer closer()
}
defer
를 사용하도록 상기시킨다.