gpt4 book ai didi

Golang指针理解

转载 作者:行者123 更新时间:2023-12-01 22:14:05 29 4
gpt4 key购买 nike

我正在学习围棋,我需要了解一些东西。我收到的错误很少。我创建了一个 Product 结构并附加了一个函数。我还得到了一个产品列表作为 slice 。实际上,我正在关注一个示例。我只是在尝试向它添加不同的端点。

我在代码的注释中添加了问题。请解释。我需要返回 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 handler 中,变量 p 已经有一个类型 (*handlers.Product) 与 data.GetProduct 函数 (*data.Product) 返回的不同。因此,您可以为将存储 data.GetProduct 结果的变量使用不同的名称。


为什么在例子中老师会这样做。 []*Product{&Product{}, &Product{}} 这是什么原因?请解释。

一般来说,因为根据语言规范,这是初始化结构 slice 的可用方法之一。老师为什么专门用​​这个方法呢?除非老师把原因说给别人听,否则没人知道,我当然不知道。


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

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

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

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

看起来像这样:

[]*Product{{}, {}}

这两个表达式的结果是一样的。

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com