补丁标准包

时间:2018-03-10 13:09:28

标签: go

我想替换标准Go库中的某些函数(具体为os.Exit)。我能这样做吗?我试过了:

myExitValue := reflect.ValueOf(func() {
    fmt.Println("exiting")
})
reflect.ValueOf(os.Exit).Set(myExitValue)

但恐慌:reflect: reflect.Value.Set using unaddressable value

2 个答案:

答案 0 :(得分:0)

即使在Reflect库的帮助下,我也不认为你想要做的事情是可以实现的。通过从另一个包中调用Go的函数/方法,您正在调用原始代码的副本

你必须要么以某种方式改变原始行为的包装函数,这是更清洁和更好的处理方式。 E.g:

// Do stuff what you need.
func ExitLog(message string) {
   fmt.Printf("an error occured with message: '%s'", message)
   os.Exit(1)
}

并调用该函数而不是原始函数。

编辑:评论中有人提到了一个用于执行此类操作的库,但请重新考虑您的意图。通过黑客攻击来重写包的行为并不被认为是干净和/或良好的做法。

Edit2:如果您在发生错误时尝试发送消息,请查看发布 - 订阅模式:

答案 1 :(得分:-3)

感谢mkopriva

package main

import (
    "fmt"
    "os"

    "github.com/bouk/monkey"
)

func myExit(code int) {
    _ = code
    fmt.Println(`I think you shouldn't exit.`)
}

func init() {
    monkey.Patch(os.Exit, myExit)
}

func main() {
    os.Exit(1)
    fmt.Println(`But why?`)
}