我正在学习围棋,我需要了解一些东西。我收到的错误很少。我创建了一个产品结构,并为其附加了一个功能。我也得到了一份产品 list 。实际上,我正在举一个例子。我只是尝试向它添加不同的端点。

我在代码注释中添加了问题。请解释。我需要返回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)
    }
}

最佳答案

不能使用data.GetProduct(id)(* data.Product类型的值)作为分配中的* Product值

p.ToJSON未定义(类型* Product没有字段或方法ToJSON)

这里的问题是,在GetProduct 处理程序中,变量p已经具有与*handlers.Product函数(data.GetProduct)返回的类型不同的类型(*data.Product)。因此,您可以对变量使用不同的名称,该变量将存储data.GetProduct的结果。

例如,为什么老师要这样做呢? [] *产品{&产品{},&产品{}}是什么原因?请解释。

通常,因为这是根据语言规范用于初始化结构片段的可用方法之一。为什么老师专门使用这种方法?除非老师将原因告知某人,否则没人会知道,我当然不会。

这会给出警告:数组, slice 或映射复合文字中的冗余类型。需要了解为什么

因为这是真的,所以根据语言规范,它是多余的,您可以在复合文字表达式中忽略元素和键的类型。

例如,以下复合文字的非冗余版本:

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

看起来像这样:
[]*Product{{}, {}}

这两个表达式的结果将是相同的。

关于go - Golang指针理解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61556675/

10-16 08:33