用 go 做开发坑好多,各位是怎么用的。

2014-01-28 16:56:46 +08:00
 9
比如用关联数组, map[string]interface{}, 最简单的循环操作却报错,要加上类型断言 --- 一次两次还好,每次都这样搞快崩溃了!关联数组存在不同类型的数据不是很正常的吗,求经验

另外 map 的相关函数相当少(其实根本没有?!),想实现 map 去重,map 合并的功能,找遍文档找不到,这不是相当基本的需求么。

...
5833 次点击
所在节点    Go 编程语言
33 条回复
xieren58
2014-01-28 17:03:38 +08:00
不用~
9
2014-01-28 17:06:25 +08:00
@xieren58 这个不是自己能说了算,泪
wayn3h0
2014-01-28 17:27:59 +08:00
@9 没觉得不方便,给个例子看看
congjunfeng
2014-01-28 17:47:56 +08:00
首先,关于map的函数问题,你应该去找第三方的库,而不是在官方文档里面找。其次,手动写一个你所说的去重、合并的功能的库,也没什么麻烦的。

没想明白你所说的“最简单的循环操作”是指什么,如果你能给出例子,可能会有个参考。

Go是一个强类型的语言,所以你不要用Ruby、Python这类动态语言的做法去做Go,你应该从C++、C的做法去看Go。
tonyseek
2014-01-28 17:50:20 +08:00
@congjunfeng 说的 Ruby Python 不是强类型的似的……

强类型 - 弱类型
动态类型 - 静态类型
congjunfeng
2014-01-28 17:52:33 +08:00
@tonyseek 你跑题了。
mahone3297
2014-01-28 20:49:18 +08:00
关联数组存在不同类型的数据不是很正常的吗
c里面,java里面,会允许这样做?所以你要看上门说的,你要以c的思想来看问题,而不是php,ruby
chrishine
2014-01-28 22:05:04 +08:00
Java这种弱逼语言就不提了.
C++可以通过lambda, declval实现关联数组不同类型.当然要说C++的地位,自然不能和Java相提并论,因为C++不是一门语言,它是许多种方言的统称.
go最好通过代码来解释一下 .
9
2014-01-28 22:12:26 +08:00
@congjunfeng @wayn3h0 @mahone3297 谢回复,我回来后想了下,主要是因为要把 php 转成 go,两者风格相差太大,php 中一个数组一个函数解决的问题,go 需要额外做很多类型判断的操作,比如说取出一条记录,id 只可能是 int 类型,php 中直接就用上了,但是 go 中就需要先转换成 int,然后需要用它做字符串操作时又要转换成 string...

map merge 的问题,我找了这个 https://github.com/peterbourgon/mergemap/blob/master/mergemap.go
像这样的库我觉得官方应该提供的,不然 http://godoc.org/ 上不会有这么多 package

我刚接触 go 不久,理解有偏差的地方,多多指教
wxstorm
2014-01-28 22:17:32 +08:00
@9 每个语言都有自己的思路, 当你学习一门新语言时,最好别把以前的经验和套路带进来。
每行都有自己的规则。
luikore
2014-01-28 22:24:39 +08:00
你需要催眠自己说判断类型是必须的, 判断类型不费劲, 判断类型很安全...
map 相关函数就不要想了, 你要修正三观, 变成不管遇到什么都先一个无脑 for 啪上去的人...
dndx
2014-01-28 23:25:47 +08:00
不想类型断言就别用 interface{} 。你在 C 下面用 void* 难道不需要 cast 就能 dereference?这跟 Go 有什么关系?
xdeng
2014-01-28 23:32:01 +08:00
我也遇到。我所知有3个
lidashuang
2014-01-29 01:15:02 +08:00
学php毁一生啊
aisk
2014-01-29 01:22:10 +08:00
@9 重构php项目何苦用go,Python或者Ruby都很好,甚至php都比go用起来顺手。go本来就不是为了一般的web项目而生的
wayn3h0
2014-01-29 03:00:17 +08:00
@9 不明白你所为的转来转去是为什么,如你说所如果id是int型,你直接用map[int]*RecordType就完了么,为什么用string做键值呢?int输出成string则fmt.Sprintf("%d", int) 不是很方便吗。。。如果还怕码字码太多,直接在RecordType里写个
func (this RecordType) IdString() string { return fmt.Sprintf("%d",this.id) }

还不没搞明白楼主所谓的坑是什么啊?循环也是很方便的嘛:
for k, v := range map {}
取值也是很方便的嘛:
if common, ok := map[key]; ok {}
darklowly
2014-01-29 06:52:15 +08:00
兰州烧饼。一说关联数组,就知道是php.这类问题都敢问,太浮躁了
9
2014-01-29 09:27:30 +08:00
@aisk 原项目用 php 写的,现在要求要用 go 改写,这是身不由己

@dndx 一些接口的 json 数据,类型不是只有一种,只能用 interface{}

@wayn3h0 需要输出 json 数据,然后 id 在输出前要拿它做很多工作,描述能力有限,但是非常感谢回复,我会好好学习的。
cnbuff410
2014-01-29 09:42:49 +08:00
楼主问一个Go的问题,就有不少不用Go的友人跑过来冷嘲热讽。这是什么样的精神啊。
pubby
2014-01-29 10:04:41 +08:00
昨天遇到一个坑
fp,_ := os.Open(...)
fp.ReadAt(buf,1000) 之后文件指针没移动(文档中没有指出这点0)
fp.Seek(0,1) 得到的当前读写位置还是0

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/98585

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX