go new函数

type Request struct {
   ...
}

r1 := new(Request)
r2 := &Request{}

r1 和 r2 有什么区别吗?

我是看到标准库中 net/http/request.go
func (r *Request) WithContext(ctx context.Context) *Request
的实现用到了new, 看了很多网上的资料都找不到为什么要用new.

阅读 4.5k
4 个回答

这个看了一下effective go,地址在这里。
https://golang.google.cn/doc/...

new并不会初始化对象,而是零值填充(zeroed)。
这个用map来验证是比较合适的。

package main

import "log"


type M map[string]string

func main(){

    m:=&M{}
    (*m)["a"] = "a"
    //正常操作map

    n := new(M)
    (*n)["a"] = "a"
    //panic: assignment to entry in nil map
}

看到new的map是一个nil map,而另一种是返回初始化之后的对象了。

r1 和 r2 没有区别。

当你不需要为结构中的成员初始化非零值的时候,完全可以使用 new 这个 golang 内置的原语

从效率上来说new速度会更快,因为new是直接返回一个地址的指针,没有初始化的一个过程

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题