Redian新闻
>
为什么大家不喜欢golang的switch?
avatar
为什么大家不喜欢golang的switch?# Programming - 葵花宝典
y*h
1
我是f2但是三年前读了一个master,然后毕业了就马上又转回f2,没有找工作,也没有
申请opt之类
的,如果签证官问起来的话,问什么读书?为什么不在美国就业?能解释说,因为自己
只是想换个专业
读书,在美国换专业容易些,为了以后回中国就业准备吗?其实我估计自己明年就回去
了。
不知道大家有什么建议?谢谢!
avatar
b*r
2
我12月8好周日要去欧洲开个会,机票宾馆早早都安排好了,回美国的签证是14年5月到
期,以为万事具备。
结果糊里糊涂,12月6号周五向学校isss递交了opt申请(我还没有job offer),周五
下午就受到一封email,说我的I20很快就要到期了,应该是12月20号学期结束。 而我
手上的老I20是14年5月过期的。
现在的情况是,
1.学校应该会issue一份新的i20,但是我离开美国之前是拿不到了
2. 即使拿到新的I20,I20的结束日期会变成13年12月20号,而我回美国入境的日期是
12月15号,海关官员会不会I20马上要过期了不让我入境?
3. 我可以周一到欧洲以后给学校Isss打电话求他们加急把I20寄给我,不知道能不能收
到。即使收到了,入境官会不会因为没有job offer拒绝我入境?
我想问我有没有可能用手上的旧I20(显示14年5月过期)入境,在海关解释我的新I20
还没到?
(我实在是太蠢了,不知道哪根筋不对了周五去提交opt申请,也没想到学校居然马上
更新我的状态了。)
avatar
p*2
3
我怎么觉得switch还可以呀。比一大堆if强呀。
avatar
h*e
4
不知道,帮顶
去试试签好了,别得表担心
avatar
p*2
5
下边是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
}
avatar
y*h
6
谢谢。

【在 h***e 的大作中提到】
: 不知道,帮顶
: 去试试签好了,别得表担心

avatar
p*2
7
还有这个, 就一个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
}
avatar
p*2
8
同样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 = ""
}
avatar
d*n
9
这个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 {

avatar
p*2
10

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

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

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

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

avatar
p*2
13
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
}
avatar
d*n
15
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.
avatar
p*2
16

这个算是很简单的函数了。一个复杂的函数可能返回的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{

avatar
l*t
17
不用pattern match的都是耍流氓
avatar
p*2
18

搞go的人哪里懂这个。

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

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

avatar
p*2
20
感觉残疾的也比一堆if强
搞go的都被洗脑了 审美观都变了

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

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

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

avatar
p*2
22
我觉得switch还行 有些时候很方便 至少比if 方便 比c的也改良了一些

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

avatar
c*f
23
case很少用 因为接channel一般都会用select
select {
case case b := }
一般需要case类语法的时候 都是用for接select接channel
avatar
p*2
24

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

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

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

前C

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

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。