由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 为什么大家不喜欢golang的switch?
相关主题
golang虽然不会一统江湖,但是,干掉python ,ruby是迟早的事情go里面channel和wait group用法比较
go也是三种paradigm混合的语言Golang的promise lib哪个好?
用golang实现了map,大牛给看看?关于RespID
golang的method是后来加的?go 的坑(转载)
怎样能把go写的稍微漂亮一点?inline functions in C++
最近学了一下 GoHow to detect overflow in C?
玩go还是要玩OOhow to initialize this struct.
golang 一个thread safe singleton问题这道题有什么好思路?
相关话题的讨论汇总
话题: switch话题: nil话题: loop话题: return话题: err
进入Programming版参与讨论
1 (共1页)
p*****2
发帖数: 21240
1
我怎么觉得switch还可以呀。比一大堆if强呀。
p*****2
发帖数: 21240
2
下边是docker的code。用的是switch,没有像版上几个go大牛说的用if呀。
func netAddrToIP4(a net.Addr) net.IP {
switch v := a.(type) {
case *net.UDPAddr:
if ip := v.IP.To4(); ip != nil {
return ip
}
case *net.IPAddr:
if ip := v.IP.To4(); ip != nil {
return ip
}
}
return nil
}
p*****2
发帖数: 21240
3
还有这个, 就一个case也用。我觉得都比if更优美一些呀。
func (c *dgramOpt) sysfd() (int, error) {
switch p := c.PacketConn.(type) {
case *net.UDPConn, *net.IPConn:
return sysfd(p.(net.Conn))
}
return 0, errInvalidConnType
}
p*****2
发帖数: 21240
4
同样docker的code, break, continue 都用到了。
func (z *Tokenizer) readRawOrRCDATA() {
if z.rawTag == "script" {
z.readScript()
z.textIsRaw = true
z.rawTag = ""
return
}
loop:
for {
c := z.readByte()
if z.err != nil {
break loop
}
if c != '<' {
continue loop
}
c = z.readByte()
if z.err != nil {
break loop
}
if c != '/' {
continue loop
}
if z.readRawEndTag() || z.err != nil {
break loop
}
}
z.data.end = z.raw.end
// A textarea's or title's RCDATA can contain escaped entities.
z.textIsRaw = z.rawTag != "textarea" && z.rawTag != "title"
z.rawTag = ""
}
d****n
发帖数: 1637
5
这个error处理的很规矩

【在 p*****2 的大作中提到】
: 同样docker的code, break, continue 都用到了。
: func (z *Tokenizer) readRawOrRCDATA() {
: if z.rawTag == "script" {
: z.readScript()
: z.textIsRaw = true
: z.rawTag = ""
: return
: }
: loop:
: for {

p*****2
发帖数: 21240
6

跟error没关系,break,continue都可以用。我写的代码有什么问题?
switch也可以用。

【在 d****n 的大作中提到】
: 这个error处理的很规矩
d****n
发帖数: 1637
7
在这和你灌水一天,就写了200行。
下次你给我发工资,我和你聊。
周末愉快!
p*****2
发帖数: 21240
8

看看这个。用switch来处理error的。
https://code.google.com/p/go-wiki/wiki/Errors
switch err := err.(type) {
case ParseError:
PrintParseError(err)
}

【在 d****n 的大作中提到】
: 在这和你灌水一天,就写了200行。
: 下次你给我发工资,我和你聊。
: 周末愉快!

p*****2
发帖数: 21240
9
https://github.com/jnwhiteh/golang/blob/
2938aa3f957639456e08be3775031e4757312da7/src/os/os_windows_test.go
其他的repo看到的
switch err {
case syscall.EWINDOWS, syscall.ERROR_PRIVILEGE_NOT_HELD:
supportsSymlinks = false
}
p*****2
发帖数: 21240
10
又一段code, http://www.goinggo.net/2014/10/error-handling-in-go-part-i.html
data, err := b.Peek(1)
if err != nil {
switch err {
case bufio.ErrNegativeCount:
// Do something specific.
return
case bufio.ErrBufferFull:
// Do something specific.
return
default:
// Do something generic.
return
}
}
相关主题
最近学了一下 Gogo里面channel和wait group用法比较
玩go还是要玩OOGolang的promise lib哪个好?
golang 一个thread safe singleton问题关于RespID
进入Programming版参与讨论
d****n
发帖数: 1637
11
switch is fine.
not using switch is only MY choice.
Most functions return very few types of known errors.(one or two)
one is the best or two.
for an example, strconv.ParseInt
if err== strconv.ErrSyntax {
// tell user format wrong
return
}
if err == strconv.ErrRange{
//maybe panic cause you system can not handle bigger than int32
}
it doesn't matter using a switch or if.
error is not C pointer NULL, which doesn't tell any thing.
error is not exception, which you always don't expect it value.
check this
http://golang.org/pkg/strconv/#ParseInt
ParseInt interprets a string s in the given base (2 to 36) and returns the
corresponding value i. If base == 0, the base is implied by the string's
prefix: base 16 for "0x", base 8 for "0", and base 10 otherwise.
The bitSize argument specifies the integer type that the result must fit
into. Bit sizes 0, 8, 16, 32, and 64 correspond to int, int8, int16, int32,
and int64.
The errors that ParseInt returns have concrete type *NumError and include
err.Num = s. If s is empty or contains invalid digits, err.Err = ErrSyntax
and the returned value is 0; if the value corresponding to s cannot be
represented by a signed integer of the given size, err.Err = ErrRange and
the returned value is the maximum magnitude integer of the appropriate
bitSize and sign.
p*****2
发帖数: 21240
12

这个算是很简单的函数了。一个复杂的函数可能返回的error是可能很多的,这个以前C
也是这样的。经常有error没有handle好。

【在 d****n 的大作中提到】
: switch is fine.
: not using switch is only MY choice.
: Most functions return very few types of known errors.(one or two)
: one is the best or two.
: for an example, strconv.ParseInt
: if err== strconv.ErrSyntax {
: // tell user format wrong
: return
: }
: if err == strconv.ErrRange{

l******t
发帖数: 55733
13
不用pattern match的都是耍流氓
p*****2
发帖数: 21240
14

搞go的人哪里懂这个。

【在 l******t 的大作中提到】
: 不用pattern match的都是耍流氓
r******t
发帖数: 250
15
很好解释 和某些语言相比 这根本就不叫 pattern matching 不想用残疾的 pattern
matching

【在 p*****2 的大作中提到】
:
: 搞go的人哪里懂这个。

p*****2
发帖数: 21240
16
感觉残疾的也比一堆if强
搞go的都被洗脑了 审美观都变了

【在 r******t 的大作中提到】
: 很好解释 和某些语言相比 这根本就不叫 pattern matching 不想用残疾的 pattern
: matching

r******t
发帖数: 250
17
就是因为没有明显强于 if 还有弱于的地方 极端的例子我写 ml 从不用 if-else
但是其他语言做好的东西并不代表另一个语言也做好了 直接照搬模式不看清优劣才属
于洗脑

【在 p*****2 的大作中提到】
: 感觉残疾的也比一堆if强
: 搞go的都被洗脑了 审美观都变了

p*****2
发帖数: 21240
18
我觉得switch还行 有些时候很方便 至少比if 方便 比c的也改良了一些

【在 r******t 的大作中提到】
: 就是因为没有明显强于 if 还有弱于的地方 极端的例子我写 ml 从不用 if-else
: 但是其他语言做好的东西并不代表另一个语言也做好了 直接照搬模式不看清优劣才属
: 于洗脑

c****f
发帖数: 1102
19
case很少用 因为接channel一般都会用select
select {
case <- a:
case b := <- c:
}
一般需要case类语法的时候 都是用for接select接channel
p*****2
发帖数: 21240
20

这东西不错,竟然没学到。我上次看的貌似没介绍select。

【在 c****f 的大作中提到】
: case很少用 因为接channel一般都会用select
: select {
: case <- a:
: case b := <- c:
: }
: 一般需要case类语法的时候 都是用for接select接channel

相关主题
go 的坑(转载)how to initialize this struct.
inline functions in C++这道题有什么好思路?
How to detect overflow in C?get_innerHTML需要什么样的permission?
进入Programming版参与讨论
c*******0
发帖数: 5247
21

任何因为concurrency而对Go感兴趣的人都应该先看看这两个视频
http://talks.golang.org/2012/concurrency.slide#33
http://blog.golang.org/advanced-go-concurrency-patterns

【在 p*****2 的大作中提到】
:
: 这东西不错,竟然没学到。我上次看的貌似没介绍select。

p*****2
发帖数: 21240
22

好。先记个笔记。

【在 c*******0 的大作中提到】
:
: 任何因为concurrency而对Go感兴趣的人都应该先看看这两个视频
: http://talks.golang.org/2012/concurrency.slide#33
: http://blog.golang.org/advanced-go-concurrency-patterns

j********x
发帖数: 2330
23
其实go搞这么蛋疼的error handling就是为了鼓励大家少做那种java error hierarchy
之类的东西
大多数情况下
error handling都可以划分成几个主要的情况进行处理
c的error code那种本来就证明是不成功的设计
为什么要搞那么多error code?
又不是必需的。。。

前C

【在 p*****2 的大作中提到】
:
: 好。先记个笔记。

1 (共1页)
进入Programming版参与讨论
相关主题
这道题有什么好思路?怎样能把go写的稍微漂亮一点?
get_innerHTML需要什么样的permission?最近学了一下 Go
如何才能到达内存带宽的极限呢?玩go还是要玩OO
紧急求助,C语言面试题golang 一个thread safe singleton问题
golang虽然不会一统江湖,但是,干掉python ,ruby是迟早的事情go里面channel和wait group用法比较
go也是三种paradigm混合的语言Golang的promise lib哪个好?
用golang实现了map,大牛给看看?关于RespID
golang的method是后来加的?go 的坑(转载)
相关话题的讨论汇总
话题: switch话题: nil话题: loop话题: return话题: err