我正在学习围棋,我需要了解一些东西。我收到的错误很少。我创建了一个产品结构,并为其附加了一个功能。我也得到了一份产品 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/