Go: доступ к свойствам структуры через интерфейс {} - PullRequest
1 голос
/ 24 октября 2019

У меня проблемы с доступом к свойствам одной структуры (с именем Params) в другом файле.

пожалуйста, рассмотрите x.go, где я вызываю функцию (CreateTodo)

type Params struct {
    Title  string `json:"title"`
    IsCompleted int `json:is_completed`
    Status  string `json:status`
}

var data = &Params{Title:"booking hotel", IsCompleted :0,Status:"not started"}

isCreated := todoModel.CreateTodo(data) // assume todoModel is imported

теперь CreateTodo - это метод для структуры (называемой Todo) в другом файле, скажем, y.go

type Todo struct {
    Id  int `json:todo_id`
    Title  string `json:"title"`
    IsCompleted int `json:is_completed`
    Status  string `json:status`
}

func (mytodo Todo)CreateTodo(data interface{}) bool{
    // want to access the properties of data here
    fmt.Println(data.Title) 
    return true
}

Теперь я просто хочу использовать свойства данных вФункция CreateTodo в y.go. Но я не могу этого сделать и получаю следующую ошибку

data.Title undefined (type interface {} is interface with no methods)

Я уверен, что проблема заключается в том, чтобы принять struct как пустой интерфейс, но я не могу понять.

Пожалуйста, помогитеhere.Thanks

Ответы [ 3 ]

2 голосов
/ 24 октября 2019

Таким образом, у вас есть один из двух вариантов, в зависимости от вашей модели:

# 1

Переключитесь на data *Params вместо data interface{}, как предлагается в другом ответе, но похоже, что выожидают разные типы в этой функции, если так;отметьте опцию № 2 ниже.

# 2

Используйте Переключатели типа следующим образом:

func (t Todo) CreateTodo(data interface{}) bool {
    switch x := data.(type) {
    case Params:
        fmt.Println(x.Title)
        return true

    // Other expected types

    default:
        // Unexpected type
        return false
    }
}

PS Будьте осторожны с вашим json тегов: должно быть json:"tagName". Обратите внимание на ""! Проверьте пойти ветеринар .

0 голосов
/ 24 октября 2019

Если вы хотите работать с Params (или *Params), вы должны это сделать.

Если вы хотите работать с непрозрачным типом, скрытым за interface{}, вы должны сделатьчто.

Короче говоря, вы не можете заглянуть за занавес, не заглядывая за занавес. Либо предоставьте действительный тип Params, чтобы вы могли посмотреть на него, либо оставьте весь код, который просматривает его в другом месте. «Храните код в другом месте» - это то, где interface действительно сияет, потому что это позволяет вам объявить, что что-то непрозрачное в противном случае имеет поведения и попросить, чтобы это поведение произошло:

type Titler interface {
    GetTitle() string
}

Если Params имеет функцию GetTitle, она становится Titler.

Теперь вы можете определить CreateTodo как функцию, которая принимает Titler, а затем вы можете передать &data к этой функции.

Эта структура в целом довольно громоздкая, и представляется гораздо более вероятным, что вместо нее Todo должна быть встраиваемой структурой, но посмотрите более полный пример, начиная с урезанной версии вашегоПример кода здесь, на игровой площадке Go .

0 голосов
/ 24 октября 2019

Вы можете просто ввести параметр функции:

func (mytodo Todo)CreateTodo(data *Params) bool{
    // want to access the properties of data here
    fmt.Println(data.Title) 
    return true
}

См .: https://play.golang.org/p/9N8ixBaSHdP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...