由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 最近学了一下 Go
相关主题
写惯了C++ code,再写C code真不习惯为什么大家不喜欢golang的switch?
Python Q: function pass in struct pointer, come back with data filled玩go还是要玩OO
请问可以这样定义struct吗?golang 一个thread safe singleton问题
golang虽然不会一统江湖,但是,干掉python ,ruby是迟早的事情go里面channel和wait group用法比较
go也是三种paradigm混合的语言Golang的promise lib哪个好?
用golang实现了map,大牛给看看?请教一个c++ 里functor的问题
golang的method是后来加的?码工试题 (转载)
怎样能把go写的稍微漂亮一点?What does the default constructor do?
相关话题的讨论汇总
话题: interface话题: pointer话题: go话题: foo话题: ok
进入Programming版参与讨论
1 (共1页)
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
5
pointer哪块你觉得复杂和困惑?
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上。这样就不会有诱惑了。当然如果你做的是面向
: 第三方开发者的库,那就要仔细考虑了。

相关主题
用golang实现了map,大牛给看看?为什么大家不喜欢golang的switch?
golang的method是后来加的?玩go还是要玩OO
怎样能把go写的稍微漂亮一点?golang 一个thread safe singleton问题
进入Programming版参与讨论
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
18
看不太懂,go目前还是niche语言吧?
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()
: }

相关主题
go里面channel和wait group用法比较码工试题 (转载)
Golang的promise lib哪个好?What does the default constructor do?
请教一个c++ 里functor的问题请教struct inside class的问题(C++)
进入Programming版参与讨论
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的优势不在语言

相关主题
golang确实是越用越觉得丑陋Python Q: function pass in struct pointer, come back with data filled
两个我永远都不想碰的语言请问可以这样定义struct吗?
写惯了C++ code,再写C code真不习惯golang虽然不会一统江湖,但是,干掉python ,ruby是迟早的事情
进入Programming版参与讨论
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参数。&不
: 行。

1 (共1页)
进入Programming版参与讨论
相关主题
What does the default constructor do?go也是三种paradigm混合的语言
请教struct inside class的问题(C++)用golang实现了map,大牛给看看?
golang确实是越用越觉得丑陋golang的method是后来加的?
两个我永远都不想碰的语言怎样能把go写的稍微漂亮一点?
写惯了C++ code,再写C code真不习惯为什么大家不喜欢golang的switch?
Python Q: function pass in struct pointer, come back with data filled玩go还是要玩OO
请问可以这样定义struct吗?golang 一个thread safe singleton问题
golang虽然不会一统江湖,但是,干掉python ,ruby是迟早的事情go里面channel和wait group用法比较
相关话题的讨论汇总
话题: interface话题: pointer话题: go话题: foo话题: ok