Как создать переменную типа Dynami c - PullRequest
0 голосов
/ 17 февраля 2020

Я могу создать переменную 'модель' типа 'Образец' следующим образом:

type Sample struct {
    Id   int    `jsonapi:"attr,id,omitempty"`
    Name string `jsonapi:"attr,name,omitempty"`
}

var model Sample // created successfully

Я могу создать ее успешно, поскольку я уже знаю тип структуры (Образец).

Однако, когда я пытался создать аналогичную переменную 'a' следующим образом, я получаю синтаксическую ошибку:

package main

import (
    "fmt"
    "reflect"
)

type Sample struct {
    Id   int    `jsonapi:"attr,id,omitempty"`
    Name string `jsonapi:"attr,name,omitempty"`
}

func test(m interface{}) {
    fmt.Println(reflect.TypeOf(m)) // prints 'main.Sample'

    var a reflect.TypeOf(m) // it throws - syntax error: unexpected ( at end of statement
}

func main() {

    var model Sample // I have created a model of type Sample
    model = Sample{Id: 1, Name: "MAK"}
    test(model)
}

Пожалуйста, посоветуйте, как создать переменную типа Dynami c в Go.

1 Ответ

1 голос
/ 17 февраля 2020
package main

import (
    "fmt"
    "reflect"
)

type Sample struct {
    Id   int    `jsonapi:"attr,id,omitempty"`
    Name string `jsonapi:"attr,name,omitempty"`
}

func test(m interface{}) {
    fmt.Println(reflect.TypeOf(m)) // prints 'main.Sample'

    a, ok := m.(main.Sample)
    if ok {
        fmt.Println(a.Id)
    }
}

func main() {

    var model Sample // I have created a model of type Sample
    model = Sample{Id: 1, Name: "MAK"}
    test(model)
}

и если вы хотите немного больше динамизма, вы можете использовать переключатель типа. Вместо a, ok := m.(main.Sample) вы делаете

switch a := m.(type) {
    case main.Sample:
        fmt.Println("It's a %s", reflect.TypeOf(m))
    case default:
        fmt.Println("It's an unknown type")
}
...