Golang 함수 포인터의 함정과 모범 사례

WBOY
풀어 주다: 2024-04-15 17:36:02
원래의
404명이 탐색했습니다.

Go의 함수 포인터 함정 및 모범 사례: 함정: 사용할 수 없는 함수를 가리키는 포인터 모범 사례: 지역 변수 또는 클로저를 사용하여 함수 값을 캡처합니다. 함정: 포인터가 가리키는 함수를 수정하세요. 모범 사례: 함수 포인터를 수정할 수 없도록 유지하고 다른 클로저에서 새 함수를 만드세요. 실제 사례: 콜백 함수 예를 들어 함수 포인터를 사용하여 로그 메시지와 심각도 수준을 콜백 함수의 매개 변수로 사용하는 로그 함수를 만듭니다.

Golang 함수 포인터의 함정과 모범 사례

Go에서 함수 포인터의 함정과 모범 사례

Go에서 함수 포인터는 함수를 값으로 전달하는 강력한 메커니즘입니다. 그러나 함수 포인터를 사용할 때 주의해야 할 몇 가지 함정이 있습니다.

트랩 1: 함수 포인터가 사용할 수 없는 함수를 가리킵니다.

함수 포인터가 더 이상 사용할 수 없는 함수를 가리킬 때 매달린 포인터 오류가 발생합니다.

func newFunc() {
    // ...
}

func main() {
    newFuncPtr := newFunc // 将函数 newFunc 赋值给指针 newFuncPtr
    newFunc = nil        // 将 newFunc 设为 nil,使其不可用
    newFuncPtr()        // 这会触发悬空指针错误
}
로그인 후 복사

모범 사례: 지역 변수 또는 클로저를 사용하여 함수 값 캡처

매달린 포인터를 방지하려면 함수 값을 지역 변수 또는 클로저로 캡처하세요.

func main() {
    newFunc := newFunc
    newFunc() // 仍然有效,因为它捕获了 newFunc 的副本
}
로그인 후 복사

트랩 2: 포인터가 가리키는 함수 수정 포인터

함수 포인터가 가리키는 함수를 수정하면 의도하지 않은 결과가 발생할 수 있습니다.

type API interface {
    Call()
}

func makeAPI() API {
    return func() {
        fmt.Println("Hello")
    }
}

func main() {
    apiPtr := makeAPI()
    apiPtr = func() {
        fmt.Println("Goodbye")
    }
    apiPtr.Call() // 输出 "Goodbye"
}
로그인 후 복사

모범 사례: 함수 포인터를 수정할 수 없도록 유지하세요.

함수 동작을 수정해야 하는 경우 다른 클로저에서 새 함수를 만드세요. :

func main() {
    api := makeAPI()
    api = func(a API) API {
        return func() {
            fmt.Println("Goodbye")
            a.Call()
        }
    }(api)
    api.Call() // 输出 "Hello", 然后是 "Goodbye"
}
로그인 후 복사

실용 사례: 콜백 함수

콜백 함수는 이벤트가 발생할 때 호출자에게 알리는 데 사용되는 함수 포인터의 일반적인 예입니다.

예를 들어, 함수 포인터를 사용하여 로그 메시지와 심각도 수준을 콜백 함수에 대한 인수로 사용하는 로깅 함수를 구축할 수 있습니다.

import "fmt"
import "log"

type Severity string

const (
    Info    Severity = "INFO"
    Warning Severity = "WARNING"
    Error   Severity = "ERROR"
)

func Log(severity Severity, message string) {
    log.Println(fmt.Sprintf("%s: %s", severity, message))
}

// 获取 severity 为 Info 的日志函数
func InfoLogger() func(string) {
    return func(message string) {
        Log(Info, message)
    }
}
로그인 후 복사

그런 다음 콜백 함수를 사용하여 로그 메시지를 로깅 함수로 보낼 수 있습니다. :

아아아아

위 내용은 Golang 함수 포인터의 함정과 모범 사례의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿