Привести интерфейс {} к типу - PullRequest
0 голосов
/ 03 декабря 2018

Скажем, у меня что-то вроде этого:

type Foo struct{
   Bar string
}

func Exported (v interface{}){
 // cast v to Foo
}

есть ли способ привести v к Foo в функции Exported?

Я пробовал утверждение типа, например, так:

func Exported (v interface{}){

  v, ok := v.(Foo)

  if !ok {
    log.Fatal("oh fuk")
  }

  // but v.Bar is not available here tho ??

}

Проблема в том, что если я пытаюсь получить доступ к v.Bar после подтверждения, он не компилируется.

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Я делал эту ошибку:

func Exported (v interface{}){

  v, ok := v.(Foo)

  if !ok {
    log.Fatal("oh fuk")
  }

  // but v.Bar is not available here tho ??

}

вам нужно использовать другое имя переменной:

func Exported (x interface{}){

  v, ok := x.(Foo)

  if !ok {
    log.Fatal("oh fuk")
  }

  // now v.Bar compiles without any further work

}
0 голосов
/ 03 декабря 2018

Проблема с именем переменной v.Пожалуйста, смотрите ниже код

func Exported (v interface{}){

  v, ok := v.(Foo)

  if !ok {
    log.Fatal("oh fuk")
  }

  // but v.Bar is not available here tho ??

}

здесь, имя интерфейса v и после приведения типов оно присваивается переменной v Поскольку v имеет тип interface, вы не можете получить значениеиз Foo struct.

Чтобы преодолеть эту проблему, используйте другое имя при приведении типов, например

b, ok := v.(Foo)

И вы сможете получить значение Bar, используя b.Bar

Рабочий пример приведен ниже:

package main

import (
    "log"
    "fmt"
)

func main() {
    foo := Foo{Bar: "Test@123"}
    Exported(foo)
}


type Foo struct{
    Bar string
}

func Exported (v interface{}){
    // cast v to Foo
    b, ok := v.(Foo)

    if !ok {
        log.Fatal("oh fuk")
    }

    fmt.Println(b.Bar)
}
0 голосов
/ 03 декабря 2018
func main() {
    f := Foo{"test"}
    Exported(f)
}

type Foo struct{
    Bar string
}

func Exported (v interface{}){
    t, ok := v.(Foo)
    if !ok {
        log.Fatal("boom")
    }
    fmt.Println(t.Bar)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...