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 | |
|
|
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的写法就是一种,如果这样就返回,不然继续。这 : 么直白的东西,实在是找不到更清晰的了。
|
|
|
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?
|
|
|
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不是我理解呀。本来就不是。
|
|
|
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世界的糟粕。 : 好了,去干活了。
|
|
|
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)
|
|
|
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本质是干嘛 : 的都没搞清楚。这种讨论没法继续,我还有正事做。
|