new有什么特殊用途?

keen_ 2014-06-03 01:37:28
比如说

new(FIle) 与 &File{}

我看不出它们有什么区别,golang不是很对添加关键字很苛刻的吗?
...全文
145 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
DeDeWo 2014-06-06
  • 打赏
  • 举报
回复
都是从堆上分配内存
飃颻 2014-06-04
  • 打赏
  • 举报
回复
在语法和语意上,Go语言的指针与C和C++中的指针类似,但Go语言的指针不支持指针运算。 通常情况下,Go语言的变量持有相应的值,该变量等同于保存值的内存块,我们可以将一个变量想象成它所持有的值来使用。 但是对于通道、函数、方法、映射以及切片的引用变量,它们持有的都是引用,即保存指针的变量。 在某些情况下,我们创建变量的同时需要获得它的指针,Go语言提供两种语法,一种是使用内置的new()函数,另一种是使用地址操作符&。 譬如结构体定义 type compser struct { name string birthYear int } 只要类型可以使用{}进行初始化的,那么 new(Type)就恒等于&Type{}。 以上两种语法都分配一个Type类型的空值,同时返回一个指向该值的指针。 如果Type不是一个可以使用{}初始化的类型,那么只能使用内置的new()函数。 使用&Type{}语法的一个好处是我们可以直接为结构体指定初始值,而不像new()函数需要再进行赋值。 Go语言不需要我们担心new()函数和地址操作符的生命周期,以及怎么将其删除,因为Go语言的内存管理会帮我们打理一切的。 摘自《Go语言程序设计》
pathletboy 2014-06-03
  • 打赏
  • 举报
回复
引用 7 楼 keen_ 的回复:
[quote=引用 6 楼 pathletboy 的回复:] [quote=引用 5 楼 keen_ 的回复:] 也不是非得new()才行呀。 var conn net.Conn x := &conn 对于一些内置的非复合类型也是同样的。 看起来,new()应该就是一个构造函数: func NewInt() * int { var a int return &a } 这种情形让我想起了c++的new,它封装了C语言的malloc并以关键字的形式出现 。 它带来的好处是显而易见的,能更方便更安全地管理内存。 但是 go语言是基于垃圾收集的,显然目标并不在内存管理。 我还是认为这只是语法糖而已。
不要太过纠结于语法,就像i++ i+=1,明明i+=1就可以做的事情为什么还要i++?如果你非得认为是语法糖,那往大了说,整个GO都是语法糖,就拿你的例子来说,如果追求简洁,那new显然更简洁, x := new(net.Conn) 只要一行代码,go的:=也是为了代码简洁而生的。[/quote]
引用 6 楼 pathletboy 的回复:
[quote=引用 5 楼 keen_ 的回复:] 也不是非得new()才行呀。 var conn net.Conn x := &conn 对于一些内置的非复合类型也是同样的。 看起来,new()应该就是一个构造函数: func NewInt() * int { var a int return &a } 这种情形让我想起了c++的new,它封装了C语言的malloc并以关键字的形式出现 。 它带来的好处是显而易见的,能更方便更安全地管理内存。 但是 go语言是基于垃圾收集的,显然目标并不在内存管理。 我还是认为这只是语法糖而已。
不要太过纠结于语法,就像i++ i+=1,明明i+=1就可以做的事情为什么还要i++?如果你非得认为是语法糖,那往大了说,整个GO都是语法糖,就拿你的例子来说,如果追求简洁,那new显然更简洁, x := new(net.Conn) 只要一行代码,go的:=也是为了代码简洁而生的。[/quote] c/c++的坑很多,吃过亏所以害怕了,呵呵。 因为new(),我想到c++哪边去了,要知道能掌控内存管理不是一件容易的事。 语法糖意味着封装过的语法,这有点DSL的意味。要知道c/c++有相当一部分是面向编译器和硬件的,包括编译器扩展的语法,这些就不是封装。我认为有必要搞清楚这些区别,这样才能做到 心中有数。 当然象channel哪样的,我不会认为它是什么语法糖。没错,象 :=这样的 我会认为它就是语法糖。我并不是否定语法糖,相反我认为它相当有用。但是作为语言的一部分来说,是应该搞清楚的。就象元编程哪样,只是使用而不明就理的话,是不太可能领会的。 [/quote] 你真想了解,就直接翻golang编译器就好,看编译器怎么处理new关键词。
keen_ 2014-06-03
  • 打赏
  • 举报
回复
引用 6 楼 pathletboy 的回复:
[quote=引用 5 楼 keen_ 的回复:] 也不是非得new()才行呀。 var conn net.Conn x := &conn 对于一些内置的非复合类型也是同样的。 看起来,new()应该就是一个构造函数: func NewInt() * int { var a int return &a } 这种情形让我想起了c++的new,它封装了C语言的malloc并以关键字的形式出现 。 它带来的好处是显而易见的,能更方便更安全地管理内存。 但是 go语言是基于垃圾收集的,显然目标并不在内存管理。 我还是认为这只是语法糖而已。
不要太过纠结于语法,就像i++ i+=1,明明i+=1就可以做的事情为什么还要i++?如果你非得认为是语法糖,那往大了说,整个GO都是语法糖,就拿你的例子来说,如果追求简洁,那new显然更简洁, x := new(net.Conn) 只要一行代码,go的:=也是为了代码简洁而生的。[/quote]
引用 6 楼 pathletboy 的回复:
[quote=引用 5 楼 keen_ 的回复:] 也不是非得new()才行呀。 var conn net.Conn x := &conn 对于一些内置的非复合类型也是同样的。 看起来,new()应该就是一个构造函数: func NewInt() * int { var a int return &a } 这种情形让我想起了c++的new,它封装了C语言的malloc并以关键字的形式出现 。 它带来的好处是显而易见的,能更方便更安全地管理内存。 但是 go语言是基于垃圾收集的,显然目标并不在内存管理。 我还是认为这只是语法糖而已。
不要太过纠结于语法,就像i++ i+=1,明明i+=1就可以做的事情为什么还要i++?如果你非得认为是语法糖,那往大了说,整个GO都是语法糖,就拿你的例子来说,如果追求简洁,那new显然更简洁, x := new(net.Conn) 只要一行代码,go的:=也是为了代码简洁而生的。[/quote] c/c++的坑很多,吃过亏所以害怕了,呵呵。 因为new(),我想到c++哪边去了,要知道能掌控内存管理不是一件容易的事。 语法糖意味着封装过的语法,这有点DSL的意味。要知道c/c++有相当一部分是面向编译器和硬件的,包括编译器扩展的语法,这些就不是封装。我认为有必要搞清楚这些区别,这样才能做到 心中有数。 当然象channel哪样的,我不会认为它是什么语法糖。没错,象 :=这样的 我会认为它就是语法糖。我并不是否定语法糖,相反我认为它相当有用。但是作为语言的一部分来说,是应该搞清楚的。就象元编程哪样,只是使用而不明就理的话,是不太可能领会的。
pathletboy 2014-06-03
  • 打赏
  • 举报
回复
引用 5 楼 keen_ 的回复:
也不是非得new()才行呀。 var conn net.Conn x := &conn 对于一些内置的非复合类型也是同样的。 看起来,new()应该就是一个构造函数: func NewInt() * int { var a int return &a } 这种情形让我想起了c++的new,它封装了C语言的malloc并以关键字的形式出现 。 它带来的好处是显而易见的,能更方便更安全地管理内存。 但是 go语言是基于垃圾收集的,显然目标并不在内存管理。 我还是认为这只是语法糖而已。
不要太过纠结于语法,就像i++ i+=1,明明i+=1就可以做的事情为什么还要i++?如果你非得认为是语法糖,那往大了说,整个GO都是语法糖,就拿你的例子来说,如果追求简洁,那new显然更简洁, x := new(net.Conn) 只要一行代码,go的:=也是为了代码简洁而生的。
keen_ 2014-06-03
  • 打赏
  • 举报
回复
也不是非得new()才行呀。 var conn net.Conn x := &conn 对于一些内置的非复合类型也是同样的。 看起来,new()应该就是一个构造函数: func NewInt() * int { var a int return &a } 这种情形让我想起了c++的new,它封装了C语言的malloc并以关键字的形式出现 。 它带来的好处是显而易见的,能更方便更安全地管理内存。 但是 go语言是基于垃圾收集的,显然目标并不在内存管理。 我还是认为这只是语法糖而已。
pathletboy 2014-06-03
  • 打赏
  • 举报
回复
有些时候必须new 比如创建一个接口指针的时候 x := new(net.Conn) x := &net.Conn{} 这样就无法编译通过的。
keen_ 2014-06-03
  • 打赏
  • 举报
回复
上面有笔误 是 p = &a才对。 为什么连编辑自己的回复也没权限呀。
keen_ 2014-06-03
  • 打赏
  • 举报
回复
引用 1 楼 hicodehi 的回复:
我好像在那本书里看到过这个问题。 new 在这里应该没有区别, 比如 user := new(User) 或者 User{} 都是复用了一个 但new有其他用途,比如创建新数组等。 我只是帮顶,不是满意回答
我现在怀疑它是否在模拟C语言的指针。 就如 p := new(T) //给出一个T类型对象的引用p,相当于C语言指针的概念; p = a //指向(引用)另一个T类型对象。 make()好象也是这个意图,slice 、map、channel既具特殊性又常用,golang就把它的构造函数也实现了。 所以,我认为它们都是语法糖。
hicodehi 2014-06-03
  • 打赏
  • 举报
回复
我好像在那本书里看到过这个问题。 new 在这里应该没有区别, 比如 user := new(User) 或者 User{} 都是复用了一个 但new有其他用途,比如创建新数组等。 我只是帮顶,不是满意回答

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧