Redian新闻
>
怎样能把go写的稍微漂亮一点?
avatar
怎样能把go写的稍微漂亮一点?# Programming - 葵花宝典
z*c
1
这个电影比2强太多了,和1比有缺点有优点。
优点吗就是机器人场面胜过1。不过片中并没有多少为3D特别设计的镜头(几乎没有)
,3D的感觉一般,戴着眼镜还累,就算是烂得掉渣的肉蒲团也有不少3D的镜头。
机器人变形,打斗是此片的大优点,故事逻辑也不错,看着很过瘾!
主要缺点很简单,就是故事发展太快太快了,一个场面一个场面的切换,完全不给你稍
微停下来回味一下的时间。1是细细铺垫,这里没有啥铺垫,大量的信息一股脑地涌过
来,我恰好前面40分钟的戏看了两遍(因为走错了放映厅重看了),感受就特别明显。
第一遍看真是有脑子跟不上的感觉。你看现在大家写的剧透,都是集中在后面的场面和
主线,前面40分钟的戏,一遍看下来可以完整讲清楚的我估计没多少人。
第二个小缺点,就是为搞笑幽默设计的桥段基本都失败。编剧和Bay都不会玩幽默。大
部分都非常傻。比如那个中国人的戏,Simons出场的戏,Sam上司的戏,Simons手下的
戏。都不好笑。
Sam面试的戏,Sam坐在汽车里面发飙的戏,都设计得一般。
我在第一个厅,大家还笑了两次,一次是Obama vs共和党,一次是Simons说错了外语,
在第二个厅从头到尾都没人笑。
第三个缺点呢是女主角,身材没得说,长得不咋地,有些镜头看着漂亮,大部分看着很
一般,vs这些年的主打的angel model我都面熟,就她是最难看。比Fox差远了,关键是
这妞看着没啥亲切感。特别有意思的是绝大部分时间她都不怎么有英国腔,可被老板抓
到Chicago有一个对话,完全是英国口音,就那么几句话。
而且这妞全篇唯一的作用就是说服老威干掉Sentinel,其他啥作用也没有,比Megan
Fox第一集的戏比差太远了,当然Fox第二集也完全是个摆设。
第四呢就是一点逻辑问题,比如老威被女主角说服,他完全可以等sentinel干掉OP再上
去占便宜,也太没脑子了。再有些细节不合理处,比如Sentinel在月球上就是后来的汽
车人形态了,也没见他扫描个车啥的。
avatar
r*t
2
iphone4 鼓吹 facetime 的时候,android 童鞋们有没有试过打 sip 的 video call
呢?linphone 和其他不少 client 都支持的。
本来就我自己而言是没啥吸引力,连 desktop 上面的 video call 都基本不用。不过
原来觉得 facebook 也没啥用现在别人也这么牛 x 了,所以想问一下 android 上面的
video call 怎么样了。
avatar
p*2
3
比如下边这段代码,怎么能好看一点?有什么trick吗?
func readUserCSV(file string, lambda func(string, string) error) error {
csvfile, err := os.Open(file)
if err {
return err
}
defer csvfile.Close()
reader := csv.NewReader(csvfile)
reader.Read()
_for:
for {
record, err := reader.Read()
switch err {
case nil:
if err = lambda(record[0], record[1]); err != nil {
return err
}
case io.EOF:
break _for
default:
return err
}
}
return nil
}
avatar
t*o
4
"我恰好前面40分钟的戏看了两遍(因为走错了放映厅重看了)"
走错了放映厅怎么可能把前面的看两遍?
avatar
z*r
5
android video call挺多,而且大部分都是跨平台的吧,比如tango

【在 r****t 的大作中提到】
: iphone4 鼓吹 facetime 的时候,android 童鞋们有没有试过打 sip 的 video call
: 呢?linphone 和其他不少 client 都支持的。
: 本来就我自己而言是没啥吸引力,连 desktop 上面的 video call 都基本不用。不过
: 原来觉得 facebook 也没啥用现在别人也这么牛 x 了,所以想问一下 android 上面的
: video call 怎么样了。

avatar
d*n
6
抛砖引玉
func readUserCSV(file string, lambda func(string, string) error) err error {
csvfile, err := os.Open(file)
if err {
return err
}
defer csvfile.Close()
reader := csv.NewReader(csvfile)
reader.Read()

for {
if err != nil{
if err == io.EOF{
err = nil
}
break
}

record, err := reader.Read()
if err !=nil{
continue
}

err = lambda(record[0], record[1])
if err != nil {
continue
}
}
return
}
avatar
z*c
7
我以为漏看了许多,实际没有漏太多

【在 t******o 的大作中提到】
: "我恰好前面40分钟的戏看了两遍(因为走错了放映厅重看了)"
: 走错了放映厅怎么可能把前面的看两遍?

avatar
p*2
8
看来go也只能这样了

{

【在 d****n 的大作中提到】
: 抛砖引玉
: func readUserCSV(file string, lambda func(string, string) error) err error {
: csvfile, err := os.Open(file)
: if err {
: return err
: }
: defer csvfile.Close()
: reader := csv.NewReader(csvfile)
: reader.Read()
:

avatar
p*n
9
剧情就是渣,最后megatron的转变太坑爹了。
场面就是一大堆金属滚来滚去,配合着刺耳的音效,都看了三部了,一点进步都没有。
整部戏就是美国大兵对战外星机器人,这次连大驱坦克都省了,沦落到跟Battle Los
Angeles一样的水平。
植入广告不少,来弄我和伊利估计花了不少钱。
我觉得唯一的亮点就是罗茜·惠特莉了,身材真是好,还有凸点,稍微值点票价。
avatar
l*t
10
return,break,continue,这很像上古语言
avatar
D*G
11
好, 不去看imax 3d的了, 省钱了
avatar
p*2
12

还有goto呢, 感觉像回到了上个世纪

【在 l******t 的大作中提到】
: return,break,continue,这很像上古语言
avatar
f*l
13
变三真是超级大烂片
avatar
w*g
14
话说我还是经常用goto的。没有goto怎么直接跳出多重循环?C++和java似乎都不能bre
ak到一个label。

【在 p*****2 的大作中提到】
:
: 还有goto呢, 感觉像回到了上个世纪

avatar
g*5
15
剧情角度是烂片,但不去看3D那就更本不用看了。
avatar
p*2
16

bre
java应该可以吧?我记得。
go的goto有些限制,不能随便goto,不能像C那么用,形成摆设了。

【在 w***g 的大作中提到】
: 话说我还是经常用goto的。没有goto怎么直接跳出多重循环?C++和java似乎都不能bre
: ak到一个label。

avatar
g*g
17
基础不扎实呀,Java当然可以。但是我个人更喜欢写成函数或者exception.

bre

【在 w***g 的大作中提到】
: 话说我还是经常用goto的。没有goto怎么直接跳出多重循环?C++和java似乎都不能bre
: ak到一个label。

avatar
t*4
18
艹, 你很牛B呀, 能写段不要26个字母的code吗?

【在 l******t 的大作中提到】
: return,break,continue,这很像上古语言
avatar
d*n
20
你这个和我的相似,但是你结尾没有return,gofmt会报警的。
我的只有一个return
To京二:
return/goto多了都是自己搞的,完全可以避免

【在 c*******0 的大作中提到】
: 这么清晰的逻辑怎么能被你写这么复杂...
: https://play.golang.org/p/yDpJ9j7Doq

avatar
c*0
21

谁说的,你试一试就知道了。早改了
我不喜欢你err = nil的用法。
我觉得关注return有几个continue有几个是本末导致。写程序是写逻辑,关键是逻辑要
清晰。

【在 d****n 的大作中提到】
: 你这个和我的相似,但是你结尾没有return,gofmt会报警的。
: 我的只有一个return
: To京二:
: return/goto多了都是自己搞的,完全可以避免

avatar
p*2
22
你这个就叫清晰?
跟error折腾来折腾去的
可能的error如果多起来你都用if else? 难道不应该用switch? 那你啥时候用switch?
ifelse 多了用switch难道不是common sense?

【在 c*******0 的大作中提到】
: 这么清晰的逻辑怎么能被你写这么复杂...
: https://play.golang.org/p/yDpJ9j7Doq

avatar
p*2
23
return 多了逻辑能清晰?
c语言都讲究只有一个return
go里这个都搞不定?

【在 c*******0 的大作中提到】
:
: 谁说的,你试一试就知道了。早改了
: 我不喜欢你err = nil的用法。
: 我觉得关注return有几个continue有几个是本末导致。写程序是写逻辑,关键是逻辑要
: 清晰。

avatar
d*n
24
我的code 里面基本没有switch,除了 type switch
而且一个else都没有。
看起来那叫舒服。
同事就喜欢nested ifelse,我心里默念他祖宗18遍

switch?

【在 p*****2 的大作中提到】
: 你这个就叫清晰?
: 跟error折腾来折腾去的
: 可能的error如果多起来你都用if else? 难道不应该用switch? 那你啥时候用switch?
: ifelse 多了用switch难道不是common sense?

avatar
d*n
25
结尾没有return, at 9:17AM PCT
package main
import (
"encoding/csv"
"fmt"
"io"
"os"
)
func main() {
if err := readUserCSV("./test.csv", lambda); err != nil {
//do something
}
}
func readUserCSV(file string, lambda func(string, string) error) error {
csvfile, err := os.Open(file)
if err != nil {
return err
}
defer csvfile.Close()
reader := csv.NewReader(csvfile)
for {
record, err := reader.Read()
if err != nil {
if err == io.EOF {
return nil
}
return err
}
if err = lambda(record[0], record[1]); err != nil {
return err
}
}
}

【在 c*******0 的大作中提到】
:
: 谁说的,你试一试就知道了。早改了
: 我不喜欢你err = nil的用法。
: 我觉得关注return有几个continue有几个是本末导致。写程序是写逻辑,关键是逻辑要
: 清晰。

avatar
c*0
26

switch?
csv parsing就两种情况,error和eof。error你要细分就是两种,ErrReadRune和
ErrQuote。你去哪找"if else多了"的情况?
你现在引入lambda之后,lambda会return err,这个是readUserCSV的caller应该去管
的,而不是readUserCSV去管的。
先把自己的需求搞清楚。

【在 p*****2 的大作中提到】
: 你这个就叫清晰?
: 跟error折腾来折腾去的
: 可能的error如果多起来你都用if else? 难道不应该用switch? 那你啥时候用switch?
: ifelse 多了用switch难道不是common sense?

avatar
d*n
27
very agree!

【在 c*******0 的大作中提到】
:
: switch?
: csv parsing就两种情况,error和eof。error你要细分就是两种,ErrReadRune和
: ErrQuote。你去哪找"if else多了"的情况?
: 你现在引入lambda之后,lambda会return err,这个是readUserCSV的caller应该去管
: 的,而不是readUserCSV去管的。
: 先把自己的需求搞清楚。

avatar
c*0
28

哎,return的英文意思是,返回。Go的写法就是一种,如果这样就返回,不然继续。这
么直白的东西,实在是找不到更清晰的了。

【在 p*****2 的大作中提到】
: return 多了逻辑能清晰?
: c语言都讲究只有一个return
: go里这个都搞不定?

avatar
d*n
29
你说出了golang error的真谛!
绝不是忽悠你。

【在 c*******0 的大作中提到】
:
: 哎,return的英文意思是,返回。Go的写法就是一种,如果这样就返回,不然继续。这
: 么直白的东西,实在是找不到更清晰的了。

avatar
c*0
30

你的版本有问题吧。
https://golang.org/doc/go1.1#return

【在 d****n 的大作中提到】
: 结尾没有return, at 9:17AM PCT
: package main
: import (
: "encoding/csv"
: "fmt"
: "io"
: "os"
: )
: func main() {
: if err := readUserCSV("./test.csv", lambda); err != nil {

avatar
d*n
31
套用赵测名言:
不会处理error的gopher都是耍流氓
@cnbuff410
avatar
d*n
32
1.4.2啊,我还以为是默认的 by gofmt

【在 c*******0 的大作中提到】
:
: 你的版本有问题吧。
: https://golang.org/doc/go1.1#return

avatar
p*2
33

你说的是specific的情况,我想表达的是一个common case,如果一个函数可能返回多
个error, 你怎么搞? 不就是一堆if else了?

【在 c*******0 的大作中提到】
:
: 你的版本有问题吧。
: https://golang.org/doc/go1.1#return

avatar
c*0
34

二爷,你这个tech leader当得有点不合格吧。你去任何一个现代化c项目里面去看看,
哪个项目讲究一个function一个return的?都是Go这种用法。
哎,自己一团浆糊无所谓,千万别把你组员害了。

【在 p*****2 的大作中提到】
: return 多了逻辑能清晰?
: c语言都讲究只有一个return
: go里这个都搞不定?

avatar
d*n
35
人家不是说过了么?
这就象C里面,caller负责给callee malloc&&free,callee只负责返回一个正确的结果
,错误交给caller
如果有多种正确的结果,把他门变成一个,让caller少操心。

【在 p*****2 的大作中提到】
:
: 你说的是specific的情况,我想表达的是一个common case,如果一个函数可能返回多
: 个error, 你怎么搞? 不就是一堆if else了?

avatar
c*0
36

你的需求是做csv parsing,干嘛管什么common case啊?我再问一下,你到底在考虑什
么common case啊?
我当然不是说swich没用,我是说在你的case里,用switch是错误的。难道你写代码不
是从需求出发,而是写什么都先考虑common case?

【在 p*****2 的大作中提到】
:
: 你说的是specific的情况,我想表达的是一个common case,如果一个函数可能返回多
: 个error, 你怎么搞? 不就是一堆if else了?

avatar
p*2
37

我搞C很多年了,一直都是那么搞的。哪些算是现代化C项目呢?
面试的时候也讲究尽量少的return呀,很多其他语言也都是希望一个地方return,我觉
得这是常识呀。
看来我需要被go洗一下脑了。能给我现代化C的项目我看看吗?

【在 c*******0 的大作中提到】
:
: 你的需求是做csv parsing,干嘛管什么common case啊?我再问一下,你到底在考虑什
: 么common case啊?
: 我当然不是说swich没用,我是说在你的case里,用switch是错误的。难道你写代码不
: 是从需求出发,而是写什么都先考虑common case?

avatar
c*0
38

OMG。我无语了。
我懒得找现代化c项目,太晚要睡觉了,你去github找找比较火的不就行了。前两天不
是有一个很牛的c项目是redis作者做的么,叫什么disque。你去看看吧,应该在github
上。

【在 p*****2 的大作中提到】
:
: 我搞C很多年了,一直都是那么搞的。哪些算是现代化C项目呢?
: 面试的时候也讲究尽量少的return呀,很多其他语言也都是希望一个地方return,我觉
: 得这是常识呀。
: 看来我需要被go洗一下脑了。能给我现代化C的项目我看看吗?

avatar
p*2
39

type switch很有用。那就是说,go里面switch基本就不应该怎么用了?就跟goto一样
,虽然有但是很难用。

【在 d****n 的大作中提到】
: 我的code 里面基本没有switch,除了 type switch
: 而且一个else都没有。
: 看起来那叫舒服。
: 同事就喜欢nested ifelse,我心里默念他祖宗18遍
:
: switch?

avatar
p*2
40

这个无所谓呀。我完全理解。

【在 d****n 的大作中提到】
: 人家不是说过了么?
: 这就象C里面,caller负责给callee malloc&&free,callee只负责返回一个正确的结果
: ,错误交给caller
: 如果有多种正确的结果,把他门变成一个,让caller少操心。

avatar
d*n
41
那倒不是,我能忍受别人用switch,但是我个人避免去用,不是gopher general.
包括no ifelse,都是我个人习惯。

【在 p*****2 的大作中提到】
:
: 这个无所谓呀。我完全理解。

avatar
c*0
42

二爷你不需要被Go洗脑,你需要被现代软件工程洗脑。
你来看看这个项目
https://github.com/Alamofire/Alamofire/blob/
333bf874b85a12c448f9d2419293e3d47e5416c2/Source/Alamofire.swift
你告诉我,pattern match的时候怎么讲究尽量少的return?你遇到变量错误的时候怎
么不用return?
我和你可能生活在平行世界里面,我还没见过什么项目是倡导一个函数就用一个return
的。给个例子开开眼界吧。

【在 p*****2 的大作中提到】
:
: 这个无所谓呀。我完全理解。

avatar
p*2
43

我只是按照这个例子,感觉一下golang的code怎么写,我写的时候想的更多的是common
case,而不是specific case。

【在 c*******0 的大作中提到】
:
: 二爷你不需要被Go洗脑,你需要被现代软件工程洗脑。
: 你来看看这个项目
: https://github.com/Alamofire/Alamofire/blob/
: 333bf874b85a12c448f9d2419293e3d47e5416c2/Source/Alamofire.swift
: 你告诉我,pattern match的时候怎么讲究尽量少的return?你遇到变量错误的时候怎
: 么不用return?
: 我和你可能生活在平行世界里面,我还没见过什么项目是倡导一个函数就用一个return
: 的。给个例子开开眼界吧。

avatar
p*2
44

return
我们真是平行世界了,现在的流行做法是用monad处理error。scala,coffee里边根本
就看不到return。

【在 c*******0 的大作中提到】
:
: 二爷你不需要被Go洗脑,你需要被现代软件工程洗脑。
: 你来看看这个项目
: https://github.com/Alamofire/Alamofire/blob/
: 333bf874b85a12c448f9d2419293e3d47e5416c2/Source/Alamofire.swift
: 你告诉我,pattern match的时候怎么讲究尽量少的return?你遇到变量错误的时候怎
: 么不用return?
: 我和你可能生活在平行世界里面,我还没见过什么项目是倡导一个函数就用一个return
: 的。给个例子开开眼界吧。

avatar
c*0
45

当然不是,type switch有type switch的用法,但不是你这种case。
我明天有时间给你举些例子吧

【在 p*****2 的大作中提到】
:
: return
: 我们真是平行世界了,现在的流行做法是用monad处理error。scala,coffee里边根本
: 就看不到return。

avatar
p*2
46

return
这个不是C呀。

【在 c*******0 的大作中提到】
:
: 当然不是,type switch有type switch的用法,但不是你这种case。
: 我明天有时间给你举些例子吧

avatar
p*2
47

type switch不是我理解呀。本来就不是。

【在 c*******0 的大作中提到】
:
: 当然不是,type switch有type switch的用法,但不是你这种case。
: 我明天有时间给你举些例子吧

avatar
c*0
48

common
我现在明白为什么Go is boring but get shit done了。原来不喜欢Go的人都喜欢把时
间花
在把问题common case化。

【在 p*****2 的大作中提到】
:
: type switch不是我理解呀。本来就不是。

avatar
c*0
49

我说了你自己去github找就行了。叫啥disque的。别的也行。随便找。

【在 p*****2 的大作中提到】
:
: type switch不是我理解呀。本来就不是。

avatar
d*n
50
"Go is boring but get shit done"
this is true, I like that.

【在 c*******0 的大作中提到】
:
: 我说了你自己去github找就行了。叫啥disque的。别的也行。随便找。

avatar
p*2
51

github
我看了,不就是我说的这样吗? 一个return。这就是你说的现代化C程序?
aeEventLoop *aeCreateEventLoop(int setsize) {
aeEventLoop *eventLoop;
int i;
if ((eventLoop = zmalloc(sizeof(*eventLoop))) == NULL) goto err;
eventLoop->events = zmalloc(sizeof(aeFileEvent)*setsize);
eventLoop->fired = zmalloc(sizeof(aeFiredEvent)*setsize);
if (eventLoop->events == NULL || eventLoop->fired == NULL) goto err;
eventLoop->setsize = setsize;
eventLoop->lastTime = time(NULL);
eventLoop->timeEventHead = NULL;
eventLoop->timeEventNextId = 0;
eventLoop->stop = 0;
eventLoop->maxfd = -1;
eventLoop->beforesleep = NULL;
if (aeApiCreate(eventLoop) == -1) goto err;
/* Events with mask == AE_NONE are not set. So let's initialize the
* vector with it. */
for (i = 0; i < setsize; i++)
eventLoop->events[i].mask = AE_NONE;
return eventLoop;
err:
if (eventLoop) {
zfree(eventLoop->events);
zfree(eventLoop->fired);
zfree(eventLoop);
}
return NULL;
}

【在 c*******0 的大作中提到】
:
: 我说了你自己去github找就行了。叫啥disque的。别的也行。随便找。

avatar
p*2
52

那你说说多个可能的error怎么写?比如一个函数可能return err1, err2, err3,
err4, err5
你的代码会如何写?

【在 c*******0 的大作中提到】
:
: 我说了你自己去github找就行了。叫啥disque的。别的也行。随便找。

avatar
p*2
53

我看了,跟我的风格一模一样,没什么不同。

【在 c*******0 的大作中提到】
:
: 我说了你自己去github找就行了。叫啥disque的。别的也行。随便找。

avatar
p*2
54
很奇怪你们到底用没用过C? 我用C也是很多年了,都是在几个大公司做。
avatar
p*2
55
error的处理业界已经有非常好的模式了,就是monad,go还是C语言的那套,但是因为
有限制,使得C语言的best practice也不能应用了。只能写成你们那个样子。
error解决方式有两个极端,一个是根本error不影响代码,高度抽象化,就是monad所
做的
一个就是error跟代码高度交互化,没有任何抽象,或者比较难抽象,需要workaround
,这个就是golang🔒提倡的
我个人prefer第一种。
avatar
d*n
56
golang故意设计成这样的,
if err!=nil{
...
}
explicit v.s. implicit or abstract
可以参看Rob Pike的视频,他有提及。
所有gopher都选择跟从他的变成喜好,也别无选择。
人家cnbuff410(chouchou)说的都够清楚了, 要么go,要么不go.
avatar
d*n
57
在对于选择设计语言feature时,Rob Pike说,我知道你们有这样那样的建议,
我尊重你们的argue,但是我选择go with my idea.
可以说golang一定程度撇弃了oop世界的糟粕。
好了,去干活了。
avatar
H*S
58
这语言比格太低。fp把recursion当作是goto用,高下立现。

【在 p*****2 的大作中提到】
: error的处理业界已经有非常好的模式了,就是monad,go还是C语言的那套,但是因为
: 有限制,使得C语言的best practice也不能应用了。只能写成你们那个样子。
: error解决方式有两个极端,一个是根本error不影响代码,高度抽象化,就是monad所
: 做的
: 一个就是error跟代码高度交互化,没有任何抽象,或者比较难抽象,需要workaround
: ,这个就是golang🔒提倡的
: 我个人prefer第一种。

avatar
p*2
59
没错 就是这么回事 可是我并不崇拜他
他说的我不觉得一定对

【在 d****n 的大作中提到】
: 在对于选择设计语言feature时,Rob Pike说,我知道你们有这样那样的建议,
: 我尊重你们的argue,但是我选择go with my idea.
: 可以说golang一定程度撇弃了oop世界的糟粕。
: 好了,去干活了。

avatar
p*2
60
go 的 并发做的很不错 就看为了并发能不能忍了
不过我真不觉得可读性高

【在 d****n 的大作中提到】
: golang故意设计成这样的,
: if err!=nil{
: ...
: }
: explicit v.s. implicit or abstract
: 可以参看Rob Pike的视频,他有提及。
: 所有gopher都选择跟从他的变成喜好,也别无选择。
: 人家cnbuff410(chouchou)说的都够清楚了, 要么go,要么不go.

avatar
p*2
61
不过go 多return确实也可以认为是一种风格 作者对编程的一种理解
因为加入了defer 使得多return的坏影响小很多了 不需要按照c那么搞
不过我会很奇怪你们认为c中多 return更好
我倒是可能outdated了 但是还真想看看什么是现代c的风格

【在 p*****2 的大作中提到】
: go 的 并发做的很不错 就看为了并发能不能忍了
: 不过我真不觉得可读性高

avatar
p*2
62
你还是说说return 多种error的时候怎么处理是go最好的写法吧 现实一点
我觉得除了多if 就是switch了 没其他选择

【在 d****n 的大作中提到】
: 在对于选择设计语言feature时,Rob Pike说,我知道你们有这样那样的建议,
: 我尊重你们的argue,但是我选择go with my idea.
: 可以说golang一定程度撇弃了oop世界的糟粕。
: 好了,去干活了。

avatar
d*n
63
myself- only deal with known error
limiting error types by handling each one specific.
func a(){
handle everything I know else return to caller
}
func b(){
err = a()
handle everything I knew, else send it to caller

}
func c(){
err = b()
handle everthing I knew, else, give to caller
}
V.S. most oop classic try...catch(I might be wrong on this)
func SuperGenericErrorHandleFunction(){

try:
a()
b()
c()
catch err:
switch err{
case a.shit:
case b.shit:
case c.shit:
case my.shit:
}
finally:
//still switch

}
this is one way how to avoid error switch
主要思路不同是,先解决细节再解决宏观,还是先入手宏观然后处理细节。your
choice.

【在 p*****2 的大作中提到】
: 你还是说说return 多种error的时候怎么处理是go最好的写法吧 现实一点
: 我觉得除了多if 就是switch了 没其他选择

avatar
c*o
64
其实error handling, 尤其是可能多个错误的parsing, 我觉得最好的是用FP的
applicative functor.
1. 可以并行处理,任意拆分组合。
2. 可以回复多个错误,不会在可恢复的错误停下。
3. 可以一直传递下去,不会有side effect.
avatar
y*j
65
他可能指的是C十十,多return没有关系,反正有destructor .
不知道为什么Go放弃了Excption Handling,又拾起了return code?

【在 p*****2 的大作中提到】
: 不过go 多return确实也可以认为是一种风格 作者对编程的一种理解
: 因为加入了defer 使得多return的坏影响小很多了 不需要按照c那么搞
: 不过我会很奇怪你们认为c中多 return更好
: 我倒是可能outdated了 但是还真想看看什么是现代c的风格

avatar
a*n
66
1 package main
2
3 import (
4 "encoding/csv"
5 "io"
6 "os"
7 )
8
9 func readUserCSV(file string, lambda func(string, string) error) error {
10 csvfile, err := os.Open(file)
11 if err != nil {
12 return err
13 }
14 defer csvfile.Close()
15
16 reader := csv.NewReader(csvfile)
17 reader.Read()
18
19 for {
20 record, err := reader.Read()
21 if err != nil && err != io.EOF {
22 return err
23 }
24 if len(record) > 2 {
25 if err = lambda(record[0], record[1]); err !=
nil {
26 return err
27 }
28 }
29 }
30 }
31
32 func main() {}
不太喜欢golang的switch case……
avatar
d*n
67
type AggError struct{
cnt int
errorVals [] interface{}
}
func myFn () error{
var aggErr AggError
for {
go func(){
...
if err!=nil{
sync.Lock()
aggErr.cnt++
aggErr.errorVals = append(aggError.errorVals, err)
sync.Unlock()
}
}()
}
return aggErr
}
func Caller(){
err := myFn()
if err == aggErr{
//handle it
}
//anything else rather than AggError is what I dont know. submit to Caller

}

【在 c******o 的大作中提到】
: 其实error handling, 尤其是可能多个错误的parsing, 我觉得最好的是用FP的
: applicative functor.
: 1. 可以并行处理,任意拆分组合。
: 2. 可以回复多个错误,不会在可恢复的错误停下。
: 3. 可以一直传递下去,不会有side effect.

avatar
d*n
68
I would change lambda function signature to let less and clearer code in
readUserCSV logic; this will keep readUserCSV low maintain
for {
record, err := reader.Read()
if err != nil && err != io.EOF {
return err
}
if err = lambdaWrapper(record,Lambda); err != nil {
return err
}
}
}
func lambdaWrapper(record,Lambda){
if len(record)!=2{
return nil //not a big deal, pass it
}
//there is nothing else can crash before calling lambda
return lambda(record[0], record[1])
}
this is how suppress error handling from switch or if else

{

【在 a***n 的大作中提到】
: 1 package main
: 2
: 3 import (
: 4 "encoding/csv"
: 5 "io"
: 6 "os"
: 7 )
: 8
: 9 func readUserCSV(file string, lambda func(string, string) error) error {
: 10 csvfile, err := os.Open(file)

avatar
p*2
69

{
看来switch大家都不喜欢。

【在 a***n 的大作中提到】
: 1 package main
: 2
: 3 import (
: 4 "encoding/csv"
: 5 "io"
: 6 "os"
: 7 )
: 8
: 9 func readUserCSV(file string, lambda func(string, string) error) error {
: 10 csvfile, err := os.Open(file)

avatar
p*2
70

如果这样为什么不直接写个monad算了?

【在 d****n 的大作中提到】
: type AggError struct{
: cnt int
: errorVals [] interface{}
: }
: func myFn () error{
: var aggErr AggError
: for {
: go func(){
: ...
: if err!=nil{

avatar
s*m
71
侬册那野蛮

bre

【在 w***g 的大作中提到】
: 话说我还是经常用goto的。没有goto怎么直接跳出多重循环?C++和java似乎都不能bre
: ak到一个label。

avatar
c*0
72

我实在是受不了了,你这个人连搜索都不知道怎么搜索?我随便搜一两个文件就一堆例
子,比如这个
https://github.com/antirez/disque/blob/master/src/adlist.c
https://github.com/antirez/disque/blob/master/src/ae_kqueue.c
我没兴趣教你怎么写Go了,你写C当年要求一个函数一个return是你乱要求,我已经告
诉你让你自己搜近几年好的c项目你又不愿意搜。作为一个C coder,return本质是干嘛
的都没搞清楚。这种讨论没法继续,我还有正事做。

【在 p*****2 的大作中提到】
:
: 如果这样为什么不直接写个monad算了?

avatar
p*2
73
上边已经搜了呀 就是你说的project
跟我一样的风格呀

【在 c*******0 的大作中提到】
:
: 我实在是受不了了,你这个人连搜索都不知道怎么搜索?我随便搜一两个文件就一堆例
: 子,比如这个
: https://github.com/antirez/disque/blob/master/src/adlist.c
: https://github.com/antirez/disque/blob/master/src/ae_kqueue.c
: 我没兴趣教你怎么写Go了,你写C当年要求一个函数一个return是你乱要求,我已经告
: 诉你让你自己搜近几年好的c项目你又不愿意搜。作为一个C coder,return本质是干嘛
: 的都没搞清楚。这种讨论没法继续,我还有正事做。

avatar
p*2
74

你这几个例子都是太简单的function了,复杂一些的你试试。

【在 c*******0 的大作中提到】
:
: 我实在是受不了了,你这个人连搜索都不知道怎么搜索?我随便搜一两个文件就一堆例
: 子,比如这个
: https://github.com/antirez/disque/blob/master/src/adlist.c
: https://github.com/antirez/disque/blob/master/src/ae_kqueue.c
: 我没兴趣教你怎么写Go了,你写C当年要求一个函数一个return是你乱要求,我已经告
: 诉你让你自己搜近几年好的c项目你又不愿意搜。作为一个C coder,return本质是干嘛
: 的都没搞清楚。这种讨论没法继续,我还有正事做。

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