go new函数

  1. type Request struct {
  2. ...
  3. }
  4. r1 := new(Request)
  5. r2 := &Request{}

r1 和 r2 有什么区别吗?

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


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

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

  1. package main
  2. import "log"
  3. type M map[string]string
  4. func main(){
  5. m:=&M{}
  6. (*m)["a"] = "a"
  7. //正常操作map
  8. n := new(M)
  9. (*n)["a"] = "a"
  10. //panic: assignment to entry in nil map
  11. }

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

r1 和 r2 没有区别。

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

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

ft_authoradmin  ft_create_time2018-11-19 18:35
 ft_update_time2018-11-19 18:40