我想替换标准Go库中的某些函数(具体为os.Exit
)。我能这样做吗?我试过了:
myExitValue := reflect.ValueOf(func() {
fmt.Println("exiting")
})
reflect.ValueOf(os.Exit).Set(myExitValue)
但恐慌:reflect: reflect.Value.Set using unaddressable value
答案 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?`)
}