gitalk
gitalk copied to clipboard
突破限制,访问其它Go package中的私有函数
http://colobu.com/2017/05/12/call-private-functions-in-other-packages/
用反射+unsafe 更方便来着 func getFieldPtr(v interface{}, name string) interface{} { rv := utils.GetRealValue(v) rt := rv.Type() for i := 0; i < rt.NumField(); i++ { t := rt.Field(i) if t.Name == name { ptr := unsafe.Pointer(rv.Field(i).UnsafeAddr()) rt2 := reflect.NewAt(t.Type, ptr).Elem() return rt2.Interface() } } return nil }
看了一圈go:linkname
的解释,还是鸟窝讲的明白。正好看到专栏中sync.Mutex
的实现,疑惑信号量的实现为什么在runtime
中。