Вам вряд ли стоит использовать указатель на интерфейс.Мой совет: никогда не используйте его, когда вам это нужно, вы будете знать.
Вместо этого, если вам нужен указатель на что-то (чтобы вы могли иметь один и тот же указатель в нескольких местах, и, таким образом, изменивуказывает значение где-то, это будет влиять на другие), "обернуть указатель" в значение интерфейса.
Поэтому сначала измените поле items
, чтобы в нем вместо значений * указателей были указаны interface{}
значения:
items map[string]interface{}
Это означает отсутствие ограничений: вы можете передавать и хранить указатели, это не проблема.
Далее измените Get()
, чтобы вернуть interface{}
:
func (cls *Container) Get(value string) interface{}{
return cls.items[value]
}
А также в Put()
, не берите адрес interface{}
:
func (cls *Container) Put(value string, a int64) {
res := cls.GetMysql(value, a)
cls.items[value] = res
}
И вам нужно ввести *Member
из значений, возвращаемых Get()
.
А теперь тестируем:
c := Container{outerType: Member{}}
c.items = make(map[string]interface{})
c.Put("Jack", 500)
res := c.Get("Jack")
fmt.Println(res)
m := res.(*Member) // Here is the problem. How to convert ?
fmt.Println(m)
Вывод (попробуйте на Go Playground ):
&{0 Jack 500 0}
&{0 Jack 500 0}
Теперь, если вы хотите изменить полеиз m
:
m.Credit = 11
И затем получить значение из кэша:
fmt.Println(c.Get("Jack"))
Мы увидим измененное значение, даже если мы это сделалине звоните Put()
(попробуйте на Go Playground ):
&{0 Jack 11 0}