avatar
go 的坑(转载)# Programming - 葵花宝典
y*e
1
是团签,结果一批被拒,说什么银行活期存款太少,某国貌似还看不动产和定期存款,
真是ft
avatar
f*y
2
Read this shocking news. Here's a summary: it says: if your house is built
with chinese drywall, it cannot be insured (sooner or later), and if the
house is not insured, the mortgage company won't allow it and will have to
forclosure your house... sounds really scary...
http://news.yahoo.com/s/ap/20091015/ap_on_re_us/us_chinese_drywall
avatar
t*c
3
from douban:
avatar
d*n
4
献给gopher们,俺还没踩到,不过惊出一身冷汗。希望对其他gopher有用
http://studygolang.com/articles/5188
坑(s)
每种编程语言都有自己的专属坑(s),Go虽出身名门,但毕竟年轻,坑也不少,在error
处理这块也可以列出几个。
1、 Go FAQ:Why is my nil error value not equal to nil?
type MyError string
func (e *MyError) Error() string {
return string(*e)
}
var ErrBad = MyError("ErrBad")
func bad() bool {
return false
}
func returnsError() error {
var p *MyError = nil
if bad() {
p = &ErrBad
}
return p // Will always return a non-nil error.
}
func main() {
err := returnsError()
if err != nil {
fmt.Println("return non-nil error")
return
}
fmt.Println("return nil")
}
上面的输出结果是”return non-nil error”,也就是说returnsError返回后,err !=
nil。err是一个interface类型变量,其underlying有两部分组成:类型和值。只有这
两部分都为nil时,err才为nil。但returnsError返回时将一个值为nil,但类型为*
MyError的变量赋值为err,这样err就不为nil。解决方法:
func returnsError() error {
var p *MyError = nil
if bad() {
p = &ErrBad
}
return nil
}
2、switch err.(type)的匹配次序
试想一下下面代码的输出结果:
type MyError string
func (e MyError) Error() string {
return string(e)
}
func Foo() error {
return MyError("foo error")
}
func main() {
err := Foo()
switch e := err.(type) {
default:
fmt.Println("default")
case error:
fmt.Println("found an error:", e)
case MyError:
fmt.Println("found MyError:", e)
}
return
}
你可能会以为会输出:”found MyError: foo error”,但实际输出却是:”found an
error: foo error”,也就是说e先匹配到了error!如果我们调换一下次序呢:
... ...
func main() {
err := Foo()
switch e := err.(type) {
default:
fmt.Println("default")
case MyError:
fmt.Println("found MyError:", e)
case error:
fmt.Println("found an error:", e)
}
return
}
这回输出结果变成了:“found MyError: foo error”。
也许你会认为这不全是错误处理的坑,和switch case的匹配顺序有关,但不可否认的
是有些人会这么去写代码,一旦这么写,坑就踩到了。因此对于通过switch case来判
定error type的情况,将error这个“通用”类型放在后面或去掉。
avatar
q*g
5
有,不过影响不大。你还是要想好万一被问到的,你总得给个理由吧。把这个理由变成
个有利条件是最好,千万别减分就行。
avatar
w*g
6
炒冷饭了. 他们怎么不sue builder. 如果数十万房子有这个问题. 早就闹大了.

【在 f*****y 的大作中提到】
: Read this shocking news. Here's a summary: it says: if your house is built
: with chinese drywall, it cannot be insured (sooner or later), and if the
: house is not insured, the mortgage company won't allow it and will have to
: forclosure your house... sounds really scary...
: http://news.yahoo.com/s/ap/20091015/ap_on_re_us/us_chinese_drywall

avatar
f*t
7
我踩到了第一个坑的变种,实在恶心。
type A struct {}
func foo() *A {
return nil
}
AssertNil(interface{} o) {
if o != nil {
panic()
}
}
AssertNotNil(foo()) 会panic,因为o是(*A)(nil),跟无类型的nil不等
avatar
p*N
8
那些鼓吹新房子的人又可以HIGH了.

【在 f*****y 的大作中提到】
: Read this shocking news. Here's a summary: it says: if your house is built
: with chinese drywall, it cannot be insured (sooner or later), and if the
: house is not insured, the mortgage company won't allow it and will have to
: forclosure your house... sounds really scary...
: http://news.yahoo.com/s/ap/20091015/ap_on_re_us/us_chinese_drywall

avatar
d*n
9
这坑我要花好多时间才能跳出来。
谢谢分享

【在 f*******t 的大作中提到】
: 我踩到了第一个坑的变种,实在恶心。
: type A struct {}
: func foo() *A {
: return nil
: }
: AssertNil(interface{} o) {
: if o != nil {
: panic()
: }
: }

avatar
a*x
10
这都哪辈子的事了

【在 f*****y 的大作中提到】
: Read this shocking news. Here's a summary: it says: if your house is built
: with chinese drywall, it cannot be insured (sooner or later), and if the
: house is not insured, the mortgage company won't allow it and will have to
: forclosure your house... sounds really scary...
: http://news.yahoo.com/s/ap/20091015/ap_on_re_us/us_chinese_drywall

avatar
t*t
11
感觉go很坑爹啊
avatar
w*j
12
没人逼美国人买啊。世界上这么多国家,美国人到中国去买,无非是价格便宜啊。美国
人自己选择买中国的商品,就要付责,检讨自己的眼光不对。
btw,个人认为这个是变相地贸易保护主义。

【在 f*****y 的大作中提到】
: Read this shocking news. Here's a summary: it says: if your house is built
: with chinese drywall, it cannot be insured (sooner or later), and if the
: house is not insured, the mortgage company won't allow it and will have to
: forclosure your house... sounds really scary...
: http://news.yahoo.com/s/ap/20091015/ap_on_re_us/us_chinese_drywall

avatar
T*7
13
1 很好理解。本来就是一個interface.两部分呢。go programming lang那本书上写的
也很清楚
先在的小孩,真以为一周看看tutorial就可以写production code了?
不看2本书就写代码就是耍流氓阿。
过去老子学c++没看4,5本书都不敢说会写c++
avatar
r*t
14
看一周已写了上万行 production code,不过仔细想想确实有些困惑的地方

【在 T******7 的大作中提到】
: 1 很好理解。本来就是一個interface.两部分呢。go programming lang那本书上写的
: 也很清楚
: 先在的小孩,真以为一周看看tutorial就可以写production code了?
: 不看2本书就写代码就是耍流氓阿。
: 过去老子学c++没看4,5本书都不敢说会写c++

avatar
r*t
15
其实就是试图写这样的程序
a := nil
如果 nil 可以 polymorphic 那么接下来就有一些困惑的事情
a = &A{...}
a = &B{...}
Go 通过 typed 'nil' 避免了这个问题 但是悄悄发生的
另外发现 Go 还可以避免 a := nil 的问题 很欣慰
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。