Golang Понимание указателя - PullRequest
0 голосов
/ 02 мая 2020

Я учусь go и мне нужно кое-что понять. Я получаю несколько ошибок. Я создал структуру Product и добавил к ней забавный c. Я также получил списки продуктов в качестве среза. На самом деле я следую одному примеру. Я просто пытался добавить разные конечные точки к нему.

Я добавил вопрос в комментарии в коде. Пожалуйста, объясни. Мне нужно вернуть json один объект в качестве ответа пользователю. Пожалуйста, ведите меня.


package data 

type Product struct {
    ID          int     `json:"id"`
    Name        string  `json:"name"`
    Description string  `json:"description"`
    Price       float32 `json:"price"`
    SKU         string  `json:"sku"`
    CreatedOn   string  `json:"-"`
    UpdatedOn   string  `json:"-"`
    DeletedOn   string  `json:"-"`
}

type Products []*Product


func (p *Products) ToJSON(w io.Writer) error {
    e := json.NewEncoder(w)
    return e.Encode(p)
}

func (p *Product) FromJSON(r io.Reader) error {
    d := json.NewDecoder(r)
    return d.Decode(p)
}

var ErrProductNotFound = fmt.Errorf("Product not found")


func GetProduct(id int) (*Product, error) {       // this is returning *Product & err. When I use this in GetProduct in handler func it is giving error
    for _, p := range productList {
        if p.ID == id {
            fmt.Println(p)
            return p, nil
        }
    }
    return nil, ErrProductNotFound
}

var productList = []*Product{    **// Why in example the teacher doing it like this.** []*Product{&Product{}, &Product{}} **what it the reason? Please explain.
    &Product{                             // this gives warning : redundant type from array, slice, or map composite literal. need to understand why**

        ID:          1,
        Name:        "Latte",
        Description: "chai",
        Price:       2.45,
        SKU:         "abc123",
        CreatedOn:   time.Now().UTC().String(),
        UpdatedOn:   time.Now().UTC().String(),
    },
    &Product{
        ID:          2,
        Name:        "Tea",
        Description: "chai",
        Price:       1.45,
        SKU:         "abc1234",
        CreatedOn:   time.Now().UTC().String(),
        UpdatedOn:   time.Now().UTC().String(),
    },
}
package handlers

func (p *Product) GetProduct(rw http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    id, _ := strconv.Atoi(vars["id"])
    p, errr := data.GetProduct(id)  **// cannot use data.GetProduct(id) (value of type *data.Product) as *Product value in assignment**
    errr = p.ToJSON(rw) // **p.ToJSON undefined (type *Product has no field or method ToJSON)**
    if errr != nil {
        http.Error(rw, "could not locate the product", http.StatusBadGateway)
    }
}

1 Ответ

1 голос
/ 02 мая 2020

не может использовать data.GetProduct (id) (значение типа * data.Product) как * Значение продукта в присвоении

p.To JSON undefined (тип * У продукта нет поля или метода. To JSON)

Проблема здесь в том, что внутри обработчика GetProduct переменная p уже имеет тип (*handlers.Product) отличается от того, который возвращается функцией data.GetProduct (*data.Product). Поэтому вы можете использовать другое имя для переменной, в которой будет храниться результат data.GetProduct.


Почему, например, учитель делает это так. [] * Product {& Product {}, & Product {}} в чем причина? Пожалуйста, объясните.

В общем, потому что это один из доступных способов инициализации фрагмента структур, согласно языку spe c. Почему учитель использовал этот метод специально? Если бы учитель не доверил кому-то причину, то никто бы не узнал, я, конечно, не знаю.


это выдает предупреждение: избыточный тип из массива, фрагмента или составного литерала карты. необходимо понять, почему

Поскольку это правда, он является избыточным, согласно языку spe c, в составном литеральном выражении вы можете elide типы элементов и ключей.

Например, не избыточная версия следующего составного литерала:

[]*Product{&Product{}, &Product{}}

будет выглядеть следующим образом:

[]*Product{{}, {}}

и результат этих двух выражений будет одинаковым.

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