Как приведение типа, когда исходный аргумент является указателем - PullRequest
0 голосов
/ 10 апреля 2020

Итак, у меня есть это:

v, ok := muxctx.Get(req, "req-body-map").(map[string]interface{})

проблема в том, что:

muxctx.Get(req, "req-body-map")

возвращает указатель. Я попытался разыменовать указатель следующим образом:

(*(muxctx.Get(req, "req-body-map"))

, но я получаю это:

Invalid indirect of '(muxctx.Get(req, "req-body-map"))' (type 'interface{}') 

, поэтому я полагаю, поскольку метод Get не возвращает указатель, тогда я не могу разыменовывать его.

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Уверен, что вы хотите что-то вроде:

// You really want this to be two variables, lest you go mad.
// OK here is mostly to see whether the value exists or not, which is what
// presumably you're testing for.  Get that out of the way before trying to
// get fancy with type coercion.
//
ptr, ok := muxctx.Get(req, "req-body-map")

... // Do other stuff (like your if test maybe)...

// Now coerce and deref.  We coerce the type inside parens THEN we try to
// dereference afterwards.
//
v := *(ptr.(*map[string]interface{}))

Краткий пример этой общей техники:

package main

import "fmt"

func main() {
    foo := 10
    var bar interface{}
    bar = &foo
    fmt.Println(bar)
    foobar := *(bar.(*int))
    fmt.Println(foobar)
}

$ ./spike
0xc00009e010
10

Наконец, убедитесь, что у вас есть нужный тип (используя отражение если это необходимо) или рискуйте, если программа запанирует c из-за неправильного принуждения.

1 голос
/ 10 апреля 2020

Метод Get равен func (m *muxctx) Get(string) interface{}, типом возвращаемого значения является интерфейс {}, если значением является int (1), тип является интерфейсом {}, если значением является map [string] interface {}, тип возвращаемого типа также interface {}.

, поэтому тип ptr является интерфейсом {} в ptr, ok := muxctx.Get(req, "req-body-map"), должен преобразовать интерфейс {} тип ptr в нужный тип, пример map [string] interface {}: ptr.(*map[string]interface{}), map ptr? ptr.(map[string]interface{}), map double ptr? ptr.(**map[string]interface{})

(*(muxctx.Get(req, "req-body-map")) код преобразования недействителен, var i interface{}; *i, тип i является интерфейсом {}, не используется * указатель удаления, необходимо преобразовать i в тип ptr, пример: n := i.(*int); *n или m := i.(*map[string]interface{}); *m.

golang spce do c:

Утверждения типа

Переключатели типа

небезопасно

Преобразования

...