由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 怎样能把go写的稍微漂亮一点?
相关主题
用golang实现了map,大牛给看看?Scala有一点不好
看了一下monad,让我想到了Java的AOPC++的牛B之处你们都还没体会到
我对为什么使用FP的理解 (补)go也是三种paradigm混合的语言
haskell 真是逆天, 各种特殊符号都有特殊用途golang的method是后来加的?
感觉解决JS callback hell的最佳解决办法就是Monadgolang确实是越用越觉得丑陋
Scala,F#或haskell怎么用DI?为什么大家不喜欢golang的switch?
golang虽然不会一统江湖,但是,干掉python ,ruby是迟早的事情最近学了一下 Go
Exception玩go还是要玩OO
相关话题的讨论汇总
话题: err话题: eventloop话题: nil话题: return话题: func
进入Programming版参与讨论
1 (共1页)
p*****2
发帖数: 21240
1
比如下边这段代码,怎么能好看一点?有什么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
}
d****n
发帖数: 1637
2
抛砖引玉
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
}
p*****2
发帖数: 21240
3
看来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()
:

l******t
发帖数: 55733
4
return,break,continue,这很像上古语言
p*****2
发帖数: 21240
5

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

【在 l******t 的大作中提到】
: return,break,continue,这很像上古语言
w***g
发帖数: 5958
6
话说我还是经常用goto的。没有goto怎么直接跳出多重循环?C++和java似乎都不能bre
ak到一个label。

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

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

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

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

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

bre

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

t****4
发帖数: 7500
9
艹, 你很牛B呀, 能写段不要26个字母的code吗?

【在 l******t 的大作中提到】
: return,break,continue,这很像上古语言
c*******0
发帖数: 5247
10
这么清晰的逻辑怎么能被你写这么复杂...
https://play.golang.org/p/yDpJ9j7Doq
相关主题
Scala,F#或haskell怎么用DI?Scala有一点不好
golang虽然不会一统江湖,但是,干掉python ,ruby是迟早的事情C++的牛B之处你们都还没体会到
Exceptiongo也是三种paradigm混合的语言
进入Programming版参与讨论
d****n
发帖数: 1637
11
你这个和我的相似,但是你结尾没有return,gofmt会报警的。
我的只有一个return
To京二:
return/goto多了都是自己搞的,完全可以避免

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

c*******0
发帖数: 5247
12

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

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

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

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

p*****2
发帖数: 21240
14
return 多了逻辑能清晰?
c语言都讲究只有一个return
go里这个都搞不定?

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

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

switch?

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

d****n
发帖数: 1637
16
结尾没有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有几个是本末导致。写程序是写逻辑,关键是逻辑要
: 清晰。

c*******0
发帖数: 5247
17

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?

d****n
发帖数: 1637
18
very agree!

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

c*******0
发帖数: 5247
19

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

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

d****n
发帖数: 1637
20
你说出了golang error的真谛!
绝不是忽悠你。

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

相关主题
golang的method是后来加的?最近学了一下 Go
golang确实是越用越觉得丑陋玩go还是要玩OO
为什么大家不喜欢golang的switch?Go的并发和channel看上去非常厉害啊
进入Programming版参与讨论
c*******0
发帖数: 5247
21

你的版本有问题吧。
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 {

d****n
发帖数: 1637
22
套用赵测名言:
不会处理error的gopher都是耍流氓
@cnbuff410
d****n
发帖数: 1637
23
1.4.2啊,我还以为是默认的 by gofmt

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

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

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

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

c*******0
发帖数: 5247
25

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

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

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

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

c*******0
发帖数: 5247
27

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

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

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

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

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

c*******0
发帖数: 5247
29

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

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

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

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

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

相关主题
Team 以前都是用dot.net的,新项目上.net core 还是golang ?看了一下monad,让我想到了Java的AOP
Typescript是不是实际上反 functional programming 的?我对为什么使用FP的理解 (补)
用golang实现了map,大牛给看看?haskell 真是逆天, 各种特殊符号都有特殊用途
进入Programming版参与讨论
p*****2
发帖数: 21240
31

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

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

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

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

c*******0
发帖数: 5247
33

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

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

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

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

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

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

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

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

c*******0
发帖数: 5247
36

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

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

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

return
这个不是C呀。

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

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

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

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

c*******0
发帖数: 5247
39

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

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

c*******0
发帖数: 5247
40

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

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

相关主题
haskell 真是逆天, 各种特殊符号都有特殊用途golang虽然不会一统江湖,但是,干掉python ,ruby是迟早的事情
感觉解决JS callback hell的最佳解决办法就是MonadException
Scala,F#或haskell怎么用DI?Scala有一点不好
进入Programming版参与讨论
d****n
发帖数: 1637
41
"Go is boring but get shit done"
this is true, I like that.

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

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

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的。别的也行。随便找。

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

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

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

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

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

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

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

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

p*****2
发帖数: 21240
50
没错 就是这么回事 可是我并不崇拜他
他说的我不觉得一定对

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

相关主题
C++的牛B之处你们都还没体会到golang确实是越用越觉得丑陋
go也是三种paradigm混合的语言为什么大家不喜欢golang的switch?
golang的method是后来加的?最近学了一下 Go
进入Programming版参与讨论
p*****2
发帖数: 21240
51
go 的 并发做的很不错 就看为了并发能不能忍了
不过我真不觉得可读性高

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

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

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

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

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

d****n
发帖数: 1637
54
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了 没其他选择

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

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

a***n
发帖数: 623
57
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……
d****n
发帖数: 1637
58
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.

d****n
发帖数: 1637
59
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)

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

{
看来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)

相关主题
玩go还是要玩OOTypescript是不是实际上反 functional programming 的?
Go的并发和channel看上去非常厉害啊用golang实现了map,大牛给看看?
Team 以前都是用dot.net的,新项目上.net core 还是golang ?看了一下monad,让我想到了Java的AOP
进入Programming版参与讨论
p*****2
发帖数: 21240
61

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

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

s*****m
发帖数: 8094
62
侬册那野蛮

bre

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

c*******0
发帖数: 5247
63

我实在是受不了了,你这个人连搜索都不知道怎么搜索?我随便搜一两个文件就一堆例
子,比如这个
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算了?

p*****2
发帖数: 21240
64
上边已经搜了呀 就是你说的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本质是干嘛
: 的都没搞清楚。这种讨论没法继续,我还有正事做。

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

你这几个例子都是太简单的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本质是干嘛
: 的都没搞清楚。这种讨论没法继续,我还有正事做。

1 (共1页)
进入Programming版参与讨论
相关主题
玩go还是要玩OO感觉解决JS callback hell的最佳解决办法就是Monad
Go的并发和channel看上去非常厉害啊Scala,F#或haskell怎么用DI?
Team 以前都是用dot.net的,新项目上.net core 还是golang ?golang虽然不会一统江湖,但是,干掉python ,ruby是迟早的事情
Typescript是不是实际上反 functional programming 的?Exception
用golang实现了map,大牛给看看?Scala有一点不好
看了一下monad,让我想到了Java的AOPC++的牛B之处你们都还没体会到
我对为什么使用FP的理解 (补)go也是三种paradigm混合的语言
haskell 真是逆天, 各种特殊符号都有特殊用途golang的method是后来加的?
相关话题的讨论汇总
话题: err话题: eventloop话题: nil话题: return话题: func