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
}
} |
|
|
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 | |
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
|
|
|
c*******0 发帖数: 5247 | |
p*****2 发帖数: 21240 | |
j********x 发帖数: 2330 | 23 其实go搞这么蛋疼的error handling就是为了鼓励大家少做那种java error hierarchy
之类的东西
大多数情况下
error handling都可以划分成几个主要的情况进行处理
c的error code那种本来就证明是不成功的设计
为什么要搞那么多error code?
又不是必需的。。。
前C
【在 p*****2 的大作中提到】 : : 好。先记个笔记。
|