У меня есть много структур, которые передают как указатель на функцию с именем AutoFilled. каждая структура отличается от другой. но некоторые поля такие же, как "creator", "createon", "edition" .., есть ли способ изменить общее поле в функции автозаполнения?

package main

import (
    "fmt"
    "time"
)

type User struct {
    ID string
    Creator string
    CreateOn time.Time
    Edition int
    Name string
    Password string
}

type Book struct {
    ID string
    Creator string
    CreateOn time.Time
    Edition int
    Name string
    ISBN string

}

func AutoFilled(v interface{}) {
    // Add Creator
    // Add CreateOn
    // Add Edition (Version) [new is zero, edit increase 1]
}

func main() {
    user := User{}
    book := Book{}

    AutoFilled(&user)
    AutoFilled(&book)

    fmt.Println(user)
    fmt.Println(book)

    fmt.Println("Thanks, playground")
}
-2
Night Owl 10 Фев 2020 в 05:42

2 ответа

Лучший ответ

Похоже, вам просто нужна общая структура, встроенная (иногда называемая mixin) в другие структуры.

type Common struct {
    ID string
    Creator string
    CreateOn time.Time
    Edition int
}
type User struct {
    Common
    Name string
    Password string
}

type Book struct {
    Common
    Name string
    ISBN string
}

Также я бы сделал функцию AutoFilled методом на Common. (Используя интерфейс, вы теряете безопасность типов.)

func (c *Common)Autofill() {
    // set fields on Common struct
}

func main() {
        user := &User{}
        user.Autofill()

2
AJR 10 Фев 2020 в 03:14

@AJR дал очень хороший вариант. вот альтернативный подход.

Для каждой структуры (Book и User) создайте метод с именем New<StructName. Взяв Book в качестве примера

func NewBook() *Book {
    return &Book {
        //you can fill in default values here for common construct
    }
} 

Вы можете дополнительно расширить этот шаблон, создав структуру Common и передав этот объект в NewBook при его создании, т.е.

func NewBook(c Common) *Book {
    return &Book {
        Common: c
        //other fields here if needed
    }
}

Теперь в вашем основном коде, вы будете делать это

func main() {
    c := NewCommon() //this method can create common object with default values or can take in values and create common object with those
    book := NewBook(c)
    //now you don't need autofill method

    fmt.Println("Thanks, playground")
}
2
Em Ae 10 Фев 2020 в 04:34