c*****e 发帖数: 3226 | 1 pointer 简直是大败笔啊, 不知道这帮猪头怎么想的,搞得好 复杂和困惑. 特别是是
和 interface 搅在一块。
还有就是那个傻逼 new vs make. |
p*****2 发帖数: 21240 | 2 从我的实践来看 最恶心的是error handling
其他还能忍受
当然error handling也不是完全不能忍受
go的优势不在语言
【在 c*****e 的大作中提到】 : pointer 简直是大败笔啊, 不知道这帮猪头怎么想的,搞得好 复杂和困惑. 特别是是 : 和 interface 搅在一块。 : 还有就是那个傻逼 new vs make.
|
g*****y 发帖数: 7271 | 3 稍微看了一下,也是觉得error handling太讨厌,就放下了。还没看到指针。
【在 p*****2 的大作中提到】 : 从我的实践来看 最恶心的是error handling : 其他还能忍受 : 当然error handling也不是完全不能忍受 : go的优势不在语言
|
p*****2 发帖数: 21240 | 4
我觉得可以把指针理解为Java的reference。
Go受到C的影响太多,所以一些概念就溷肴了。
【在 g*****y 的大作中提到】 : 稍微看了一下,也是觉得error handling太讨厌,就放下了。还没看到指针。
|
c*******0 发帖数: 5247 | |
c*****e 发帖数: 3226 | 6 func (*xyx) foo(m *abc)
var x1 xyz
var x2 *xyz
x1.foo OK
x2.foo. OK
var a1 abc
var a2 *abc
x1.foo(a2) OK
x1.foo(a1) not OK
再加上 interface 你就更晕。然后又是 new , make, 这不是操他妈的 有病么。 还
不如学 java, 就一个 Foo f = new Foo(...)
何必区分这些指针的细节呢。
就一个画虎画成猫的写照。 典型的一个c/c++ 怪胎。
【在 c*******0 的大作中提到】 : pointer哪块你觉得复杂和困惑?
|
c*******0 发帖数: 5247 | 7
这个为什么会晕呢?如果有C背景很好理解啊。
首先,Go支持Pointer和Value的interface的原因是Go是pass by value的语言。如果你
interface定义在value上, 那么你永远不能修改这个receiver里面的东西,比如
struct里面的field。有时候你会有修改的需求,比如 receiver要变,或者有时候作为
receiver的struct非常非常大,那你是希望以pointer作为 receiver,而不是value作
为receiver。
但你用来判断的原则是和C一样的,C里面要传一个需要更改的值,或者传一个特别大的
值,不也有value和pointer之分么?
New和Make确实是design deficit,记得Gophercon第一届的时候Go team聊到这个也有
点后悔,但没法改了。
【在 c*****e 的大作中提到】 : func (*xyx) foo(m *abc) : var x1 xyz : var x2 *xyz : x1.foo OK : x2.foo. OK : var a1 abc : var a2 *abc : x1.foo(a2) OK : x1.foo(a1) not OK : 再加上 interface 你就更晕。然后又是 new , make, 这不是操他妈的 有病么。 还
|
p*****2 发帖数: 21240 | 8 指针主要是继承了C的struct搞的,因为struct就是pass by value的,否则就需要pass
by pointer
Go里面没有class,所以跟Java不一样,by default 不是pass by reference
跟C不一样的是,无论是不是pointer都是s.method来表示,没有C里面的-> |
c*******0 发帖数: 5247 | 9 Go社区里面rule of thumb是这样,除非你的数据结构是你特别禁止不能有指针指向,
否则interface都可以定义在pointer上。这样就不会有诱惑了。当然如果你做的是面向
第三方开发者的库,那就要仔细考虑了。 |
p*****2 发帖数: 21240 | 10
new和make也没有办法吧?很难自圆其说,如果不是两个的话。
【在 c*******0 的大作中提到】 : Go社区里面rule of thumb是这样,除非你的数据结构是你特别禁止不能有指针指向, : 否则interface都可以定义在pointer上。这样就不会有诱惑了。当然如果你做的是面向 : 第三方开发者的库,那就要仔细考虑了。
|
|
|
c*******0 发帖数: 5247 | 11
要语义上unify还是可能的,make(*T)就相当于new了。Go team早期好像有过这个
proposal,被当时大部分社区成员给否了。
事实上目前的共识也是用& operator来做new,也就是说基本上代码里面都不用new了。
【在 p*****2 的大作中提到】 : : new和make也没有办法吧?很难自圆其说,如果不是两个的话。
|
c*****e 发帖数: 3226 | 12 为何要按照 c/c++ 背景来理解? 为何不能做成 Java 方式的? 在 c++ 里面,struct
就是 class, 所以也不存在另外一位同学说的理由, 一切做成 pass by reference
有什么问题?
【在 c*******0 的大作中提到】 : : 要语义上unify还是可能的,make(*T)就相当于new了。Go team早期好像有过这个 : proposal,被当时大部分社区成员给否了。 : 事实上目前的共识也是用& operator来做new,也就是说基本上代码里面都不用new了。
|
c****f 发帖数: 1102 | 13 go的pointer只有真正pointer一半功能 其实根本不复杂
interface这个概念纯粹是为了做duck type搞出来的 如果你从oo转过来 就当它是个大
类的method就好了
只有interface需要做type assertion 因为可以接受任何type会导致代码出错
其实go只有几个概念要学
goroutine channel 和interface
其他都和C差不多
看你从什么类型的语言转了 |
p*****2 发帖数: 21240 | 14
struct
reference
作者就是搞C的,对其他语言了解程度有限呀。
【在 c*****e 的大作中提到】 : 为何要按照 c/c++ 背景来理解? 为何不能做成 Java 方式的? 在 c++ 里面,struct : 就是 class, 所以也不存在另外一位同学说的理由, 一切做成 pass by reference : 有什么问题?
|
p*****2 发帖数: 21240 | 15
lambda应该也算一个
【在 c****f 的大作中提到】 : go的pointer只有真正pointer一半功能 其实根本不复杂 : interface这个概念纯粹是为了做duck type搞出来的 如果你从oo转过来 就当它是个大 : 类的method就好了 : 只有interface需要做type assertion 因为可以接受任何type会导致代码出错 : 其实go只有几个概念要学 : goroutine channel 和interface : 其他都和C差不多 : 看你从什么类型的语言转了
|
c*****e 发帖数: 3226 | 16 不是复杂不复杂的问题,作为一种高级语言,这是毫无必要的复杂。pointer 毫无必要。
另外,interface 也搞个不伦不类的 type assertion, 弄个
Foo implements interface_xyz 多简单直观
的事情。现在倒好,我还要一个一个的函数去检查,到底有没有实现那个 interface。
蠢到家,想做个新语言,又不想吸收 java 的优点,故意标新立异搞个怪物。no zuo
, no die.
【在 c****f 的大作中提到】 : go的pointer只有真正pointer一半功能 其实根本不复杂 : interface这个概念纯粹是为了做duck type搞出来的 如果你从oo转过来 就当它是个大 : 类的method就好了 : 只有interface需要做type assertion 因为可以接受任何type会导致代码出错 : 其实go只有几个概念要学 : goroutine channel 和interface : 其他都和C差不多 : 看你从什么类型的语言转了
|
c*****e 发帖数: 3226 | 17 再聊聊这个 pointer与 interface 的傻逼关系。
type Foo struct {}
func (f Foo) xyz1() ..
func (f *Foo) abc1()...
type InterfaceXyz interface{
xyz1()
}
type InterfaceAbc interface{
abc1()
}
func Add(a InterfaceXyz)
func Dec(b InterfaceAbc)
var k Foo
Add(k) --> OK
Dec(k) ---> not OK
g:=new(Foo)
Add(g) ---> ok
Dec(g) --> OK
所以一个 object 是否实现了一个 interface 取决于你用的是 value 还是 pointer.
有病而且病的不轻!
要。
zuo
【在 c*****e 的大作中提到】 : 不是复杂不复杂的问题,作为一种高级语言,这是毫无必要的复杂。pointer 毫无必要。 : 另外,interface 也搞个不伦不类的 type assertion, 弄个 : Foo implements interface_xyz 多简单直观 : 的事情。现在倒好,我还要一个一个的函数去检查,到底有没有实现那个 interface。 : 蠢到家,想做个新语言,又不想吸收 java 的优点,故意标新立异搞个怪物。no zuo : , no die.
|
b******y 发帖数: 9224 | |
p*****2 发帖数: 21240 | 19 我只能说 为了并发就忍了
【在 c*****e 的大作中提到】 : 再聊聊这个 pointer与 interface 的傻逼关系。 : type Foo struct {} : func (f Foo) xyz1() .. : func (f *Foo) abc1()... : type InterfaceXyz interface{ : xyz1() : } : type InterfaceAbc interface{ : abc1() : }
|
l*********s 发帖数: 5409 | 20 这会有什么实际影响?你把reference 想成一个derived type,有不同的interface不
就是很自然的事? 脑子不要那么死板教条就行了。
【在 c*****e 的大作中提到】 : 再聊聊这个 pointer与 interface 的傻逼关系。 : type Foo struct {} : func (f Foo) xyz1() .. : func (f *Foo) abc1()... : type InterfaceXyz interface{ : xyz1() : } : type InterfaceAbc interface{ : abc1() : }
|
|
|
p*****2 发帖数: 21240 | 21 不能怨lz go的作者确实视野窄了点
go属于吐啊吐啊就习惯了的语言
【在 l*********s 的大作中提到】 : 这会有什么实际影响?你把reference 想成一个derived type,有不同的interface不 : 就是很自然的事? 脑子不要那么死板教条就行了。
|
c*******0 发帖数: 5247 | 22
要。
zuo
Go是Modern C,不是Modern Java,Pointer你觉得没必要,别人觉得有必要。
如果你觉得Java这种(Foo implements interface_x, interface_y, interface_z,
interface_a, interface_b .....) 简单直观,我觉得那是编程理念冲突,确实没啥好
讨论的。
哥们,最后多嘴奉劝一句,在理解不深的情况下刚学一个东西就开骂,不是一个好的学
习习惯。
【在 c*****e 的大作中提到】 : 不是复杂不复杂的问题,作为一种高级语言,这是毫无必要的复杂。pointer 毫无必要。 : 另外,interface 也搞个不伦不类的 type assertion, 弄个 : Foo implements interface_xyz 多简单直观 : 的事情。现在倒好,我还要一个一个的函数去检查,到底有没有实现那个 interface。 : 蠢到家,想做个新语言,又不想吸收 java 的优点,故意标新立异搞个怪物。no zuo : , no die.
|
l*********s 发帖数: 5409 | 23 That is called "having focus", a good thing in my dictionary : -)
【在 p*****2 的大作中提到】 : 不能怨lz go的作者确实视野窄了点 : go属于吐啊吐啊就习惯了的语言
|
p*****2 发帖数: 21240 | 24
我觉得swift的设计要更优秀的多
【在 l*********s 的大作中提到】 : That is called "having focus", a good thing in my dictionary : -)
|
j********x 发帖数: 2330 | 25 swift作为app开发语言设计确实漂亮很多
可惜跟c比太复杂 离硬件又太远
跟c++比太简单 缺乏强大的抽象能力
【在 p*****2 的大作中提到】 : : 我觉得swift的设计要更优秀的多
|
j********x 发帖数: 2330 | 26 这个基本是语言基本设定
pointer本来就是meta typing的一部分
放在类型系统里确实是不太协调
不过从实用主义角度来说
pointer用处很大
放弃之后不太值当(或者说rob pike觉得不太值当)
这个角度来说java确实更加优秀
当然整体比较
java也是远比go优秀的语言
至于new和make
我觉得make就是做map channel slice
其余用&或者new
可以理解为make语义区分上的选择
实现上也简单一些
make估计就是new+initi call之类的
实用主义嘛
总免不了恶心一下
【在 c*****e 的大作中提到】 : func (*xyx) foo(m *abc) : var x1 xyz : var x2 *xyz : x1.foo OK : x2.foo. OK : var a1 abc : var a2 *abc : x1.foo(a2) OK : x1.foo(a1) not OK : 再加上 interface 你就更晕。然后又是 new , make, 这不是操他妈的 有病么。 还
|
c*****e 发帖数: 3226 | 27 最近发现这个说法“无论是不是pointer都是s.method来表示“ 似乎也不一定了。
func a(x * InterfaceA) {
x.foo() // pointer defer does not work
(*x).foo() // ok
}
pass
【在 p*****2 的大作中提到】 : 指针主要是继承了C的struct搞的,因为struct就是pass by value的,否则就需要pass : by pointer : Go里面没有class,所以跟Java不一样,by default 不是pass by reference : 跟C不一样的是,无论是不是pointer都是s.method来表示,没有C里面的->
|
p*****2 发帖数: 21240 | 28
可能说法有误。method定义的时候指定是struct还是pointer的。
s.attribute应该是有效吧?
【在 c*****e 的大作中提到】 : 最近发现这个说法“无论是不是pointer都是s.method来表示“ 似乎也不一定了。 : func a(x * InterfaceA) { : x.foo() // pointer defer does not work : (*x).foo() // ok : } : : pass
|
p*****2 发帖数: 21240 | 29
事实上目前的共识也是用& operator来做new,也就是说基本上代码里面都不用new了。
这两天感受了一下,感觉&确实应该好用,因为可以同时initialize。new貌似就不行。
这样看来确实new没什么必要了。感觉slice,map也没有必要用make,那基本上也就是
chann必须用make了?
【在 c*******0 的大作中提到】 : : 要。 : zuo : Go是Modern C,不是Modern Java,Pointer你觉得没必要,别人觉得有必要。 : 如果你觉得Java这种(Foo implements interface_x, interface_y, interface_z, : interface_a, interface_b .....) 简单直观,我觉得那是编程理念冲突,确实没啥好 : 讨论的。 : 哥们,最后多嘴奉劝一句,在理解不深的情况下刚学一个东西就开骂,不是一个好的学 : 习习惯。
|
b*******s 发帖数: 5216 | 30 all c-like languages have ugly error handling
golang isn't the worst
【在 p*****2 的大作中提到】 : 从我的实践来看 最恶心的是error handling : 其他还能忍受 : 当然error handling也不是完全不能忍受 : go的优势不在语言
|
|
|
p*****2 发帖数: 21240 | 31
哪个是worst?
【在 b*******s 的大作中提到】 : all c-like languages have ugly error handling : golang isn't the worst
|
c*******0 发帖数: 5247 | 32
Slice和map要用make啊。
【在 p*****2 的大作中提到】 : : 哪个是worst?
|
p*****2 发帖数: 21240 | 33
[]int{}
map[string]string{}
不就可以了吗?
【在 c*******0 的大作中提到】 : : Slice和map要用make啊。
|
c*******0 发帖数: 5247 | 34
那你slice的length和cap怎么做?
【在 p*****2 的大作中提到】 : : []int{} : map[string]string{} : 不就可以了吗?
|
p*****2 发帖数: 21240 | 35
可以初始化,需要添加用append。
【在 c*******0 的大作中提到】 : : 那你slice的length和cap怎么做?
|
c*******0 发帖数: 5247 | 36
没法做cap。
我觉得还是用make统一比较好,因为make可以对一些数据结构做对应的init参数。&不
行。
【在 p*****2 的大作中提到】 : : 可以初始化,需要添加用append。
|
p*****2 发帖数: 21240 | 37 不一定都需要init成zero values
cap主要用途是什么? performance?
【在 c*******0 的大作中提到】 : : 没法做cap。 : 我觉得还是用make统一比较好,因为make可以对一些数据结构做对应的init参数。&不 : 行。
|