golang은 gofunc와 defer를 잘 사용합니다.
3175 단어 Go 개발
1. error와 panic:
1. 패닉의 품위
예:
func main() {
defer fmt.Println("defer main")
var user = os.Getenv("USER_")
go func() {
defer fmt.Println("defer caller")
func() {
defer func() {
fmt.Println("defer here")
}()
if user == "" {
panic("should set user env.")
}
}()
}()
time.Sleep(1 * time.Second)
fmt.Printf("get result")
}
//result:
defer here
defer caller
panic: should set user env.
func main() {
defer fmt.Println("defer main")
var user = os.Getenv("USER_")
go func() {
defer fmt.Println("defer caller")
func() {
if user == "" {
panic("should set user env.")
}
defer func() {//panic , ,
fmt.Println("defer here")
}()
}()
}()
time.Sleep(1 * time.Second)
fmt.Printf("get result")
}
//result:
defer caller
panic: should set user env.
2. 패닉의 처리: defer+recover
defer func() {
err := recover()
if err != nil {//recover , panic
var errMsg, logMsg string
switch err.(type) {
case *global.FlyWebError: //web error
webErr := err.(*global.FlyWebError)
code = webErr.Code
errMsg = util.GetErrMsgByCode(code)
logMsg = webErr.Msg
default: //
code = util.ERRCODE_UNKNOWN
errMsg = util.GetErrMsgByCode(code)
logMsg = fmt.Sprint(err)
}
log.Error(common.LOG_CMD, logMsg, 0, 0, 0)
}
}()
2. gofunc()와panic
gofunc () 는 익명 함수 내의 논리를 실행하기 위해 하위 협정을 실행합니다.
func () + defer는 일반적으로 다음과 같은 용도로 사용됩니다. 원격 호출을 여러 번 하고, 매번 새로운 협정을 열어 실행합니다. 결과를 기다리지 않고 다음 번을 순환할 수 있습니다. 예를 들어
wg := sync.WaitGroup{}
wg.Add(len(arrCommentIds))
for i := 0; i < len(arrCommentIds); i++ {
go func(commentId []string) {
defer func() {
wg.Done()
if err0 := recover(); err0 != nil {
err = errors.New(fmt.Sprint(err0))
}
}()
var tempCommentList *centerpb.CommentList
tempCommentList, err = rpc.GetCommentInfo(commentId, targetId, filter)
if err != nil {
return
}
mutex.Lock()
commentList.Comments = append(commentList.Comments, tempCommentList.Comments...)
mutex.Unlock()
}(arrCommentIds[i])
}
wg.Wait()//
그래서 defer의 용도는 일반적으로 다음과 같다.
defer를 사용하는 것은 대가가 있기 때문에 cpu의 낭비를 초래할 수 있으므로 합리적으로 사용해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Go 바이너리 컴파일, 실행 및 실행 행 명령설치 패키지 생성 시스템 실행 섞어서 편집하다 실행 명령 패키지 linux(./main 컴파일된 파일은 채집할 수 있습니다./main & 백엔드 실행) Windows(main.exe GoModTest.exe -nam...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.