golang 对&与new的一点小区别的理解

func (h *http) Get(r *ghttp.Request, url string, data interface{}) (resp *define.RespService, err error) {
	var dataMap = make(map[string]string)
	if data != nil {
		dataMap = gconv.MapStrStr(data)
	}

	var queryString string
	if len(dataMap) > 1 {
		for key, value := range dataMap {
			tmpQueryString := key + "=" + value + "&"
			queryString = queryString + tmpQueryString
		}
	}
	var qs string
	if len(queryString) > 0 {
		qs = queryString[:len(queryString)-1]
	}
	g.Log().Info(reflect.TypeOf(resp))

	url = url + "?" + qs
	res, err := g.Client().Get(url)
	if err != nil {
		return nil, err
	}
	defer res.Close()
	content := res.ReadAll()
	g.Log().Info("post请求链接地址url:", url)
	g.Log().Info("post请求参数:", data)
	g.Log().Info("post请求返回内容:", content)
	result := gconv.Map(content)
	fmt.Printf("%T\n",resp)
	//该处&resp的一点理解,&对resp类型进行初始化(不一定都是各类型的零值),并返回指向该对象的指针
	//&与new的区别,new会初始化零值,&可以预设自己的值,其他可以是零值
	//注意返回的执行该实体的指针跟该实体是不一样的
	if err := gconv.Struct(content, &resp); err != nil {
		g.Log().Info(11,err)
	}
	g.Log().Info(1111,resp)
	if err := gconv.Struct(result, &resp); err != nil {
		g.Log().Info(222,err)
	}
	g.Log().Info(2222,resp)
	return resp, err
}
上一篇:JDK和CGLIB生成动态代理类的区别(转)


下一篇:使用云函数构建短信验证码服务的案例