私が最初にロガーのコンテキストに保存されている属性にアクセスされている、あなたは正確を求め何を通過します。移動中
反射がType
とValue
に基づいています。 Type
を使用しているデータにアクセスすることはできません。タイプに関する情報があるだけです(驚きです)。ですから、ここでは反射の側にValue
を使用する必要があります。
ただし、ロガーのctx
フィールドはエクスポートされないため、直接アクセスすることはできません。しかし、安全でない操作を少し使用すると、それが実行可能になります。ここで
はコードです:
package main
import (
"fmt"
"reflect"
"unsafe"
)
type logger struct {
ctx []interface{}
}
type Logger interface {
Populate(ctx ...interface{})
}
func NewLogger() Logger {
return &logger{}
}
func (l *logger) Populate(ctx ...interface{}) {
l.ctx = ctx
}
func main() {
log := NewLogger()
log.Populate(42, "42", 84, "84")
fmt.Println(log)
// &{[42 42 84 84]}
v := reflect.ValueOf(log).Elem()
field := v.FieldByName("ctx")
ar := *(*[]interface{})(unsafe.Pointer(field.UnsafeAddr()))
for _, i := range ar {
fmt.Println(i)
}
// 42 42 84 84
}
Go playground
コードが動作すると、あなたは何を期待生成することを決してしないでください。しかし、何をやっていることはサードパーティライブラリのアンエクスポート構造体から値を取得するために反射し、安全でない操作を使用しています。私の英語は正しく表現するのに十分ではありません悪いこれはです。
あなたが最初の場所でそれを2回入れないで、ロガーで二度同じ属性を持ってしたくない場合は、上記のコードを維持するよりもはるかに良いと簡単です。
あなたはまだあなたがロガーに含まれる属性を格納構造体にロガーをラップそして、このために十分な自分を信用していない場合。少なくとも、あなたが手を携えて同じ仕事をすることになるでしょう。
このコードは自由に使用できます。しかし、あなたが自分の好意を持ちたいのであれば、あなたはそれを使用しません。
少なくともコードや何かを提供したいと思うかもしれません、あるいはあなたの質問が投票に落ちることになります – Datsik