用 go 做开发坑好多,各位是怎么用的。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
9
V2EX    Go 编程语言

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

  •  
  •   9 2014 年 1 月 28 日 6333 次点击
    这是一个创建于 4372 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如用关联数组, map[string]interface{}, 最简单的循环操作却报错,要加上类型断言 --- 一次两次还好,每次都这样搞快崩溃了!关联数组存在不同类型的数据不是很正常的吗,求经验

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

    ...
    33 条回复    2016-12-30 17:32:39 +08:00
    xieren58
        1
    xieren58  
       2014 年 1 月 28 日   3
    不用~
    9
        2
    9  
    OP
       2014 年 1 月 28 日
    @xieren58 这个不是自己能说了算,泪
    wayn3h0
        3
    wayn3h0  
       2014 年 1 月 28 日 via iPhone
    @9 没觉得不方便,给个例子看看
    congjunfeng
        4
    congjunfeng  
       2014 年 1 月 28 日   1
    首先,关于map的函数问题,你应该去找第三方的库,而不是在官方文档里面找。其次,手动写一个你所说的去重、合并的功能的库,也没什么麻烦的。

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

    Go是一个强类型的语言,所以你不要用Ruby、Python这类动态语言的做法去做Go,你应该从C++、C的做法去看Go。
    tonyseek
        5
    tonyseek  
       2014 年 1 月 28 日   7
    @congjunfeng 说的 Ruby Python 不是强类型的似的……

    强类型 - 弱类型
    动态类型 - 静态类型
    congjunfeng
        6
    congjunfeng  
       2014 年 1 月 28 日
    @tonyseek 你跑题了。
    mahone3297
        7
    mahone3297  
       2014 年 1 月 28 日   1
    关联数组存在不同类型的数据不是很正常的吗
    c里面,java里面,会允许这样做?所以你要看上门说的,你要以c的思想来看问题,而不是php,ruby
    chrishine
        8
    chrishine  
       2014 年 1 月 28 日
    Java这种弱逼语言就不提了.
    C++可以通过lambda, declval实现关联数组不同类型.当然要说C++的地位,自然不能和Java相提并论,因为C++不是一门语言,它是许多种方言的统称.
    go最好通过代码来解释一下 .
    9
        9
    9  
    OP
       2014 年 1 月 28 日
    @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
        10
    wxstorm  
       2014 年 1 月 28 日
    @9 每个语言都有自己的思路, 当你学习一门新语言时,最好别把以前的经验和套路带进来。
    每行都有自己的规则。
    luikore
        11
    luikore  
       2014 年 1 月 28 日   1
    你需要催眠自己说判断类型是必须的, 判断类型不费劲, 判断类型很安全...
    map 相关函数就不要想了, 你要修正三观, 变成不管遇到什么都先一个无脑 for 啪上去的人...
    dndx
        12
    dndx  
       2014 年 1 月 28 日
    不想类型断言就别用 interface{} 。你在 C 下面用 void* 难道不需要 cast 就能 dereference?这跟 Go 有什么关系?
    xdeng
        13
    xdeng  
       2014 年 1 月 28 日 via iPhone
    我也遇到。我所知有3个
    G2bN4dbX9J3ncp0r
        14
    G2bN4dbX9J3ncp0r  
       2014 年 1 月 29 日   1
    学php毁一生啊
    aisk
        15
    aisk  
       2014 年 1 月 29 日   2
    @9 重构php项目何苦用go,Python或者Ruby都很好,甚至php都比go用起来顺手。go本来就不是为了一般的web项目而生的
    wayn3h0
        16
    wayn3h0  
       2014 年 1 月 29 日   1
    @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
        17
    darklowly  
       2014 年 1 月 29 日 via iPhone
    兰州烧饼。一说关联数组,就知道是php.这类问题都敢问,太浮躁了
    9
        18
    9  
    OP
       2014 年 1 月 29 日
    @aisk 原项目用 php 写的,现在要求要用 go 改写,这是身不由己

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

    @wayn3h0 需要输出 json 数据,然后 id 在输出前要拿它做很多工作,描述能力有限,但是非常感谢回复,我会好好学习的。
    cnbuff410
        19
    cnbuff410  
       2014 年 1 月 29 日
    楼主问一个Go的问题,就有不少不用Go的友人跑过来冷嘲热讽。这是什么样的精神啊。
    pubby
        20
    pubby  
       2014 年 1 月 29 日
    昨天遇到一个坑
    fp,_ := os.Open(...)
    fp.ReadAt(buf,1000) 之后文件指针没移动(文档中没有指出这点0)
    fp.Seek(0,1) 得到的当前读写位置还是0
    davepkxxx
        21
    davepkxxx  
       2014 年 1 月 29 日
    我试用了一段时间之后就继续回去玩scala了,go吸引我的就只剩多返回值这一点了。
    zonyitoo
        22
    zonyitoo  
       2014 年 1 月 29 日
    我用了一阵子Go发现很多坑,不过依然在坚持用,因为它很像C,用起来挺亲切的。不过相比一直喜爱的Python,Go用得实在是憋屈
    luikore
        23
    luikore  
       2014 年 1 月 29 日
    @wayn3h0 你是没写过处理大量 json 的程序吧... 一堆 for 面条代码过后都看不出是干嘛的指的就是那种"方便"的代码
    Yiner
        24
    Yiner  
       2014 年 1 月 29 日
    @tonyseek Python本来就不是强类型~
    9
        25
    9  
    OP
       2014 年 1 月 29 日
    @wayn3h0 刚看官方博客 http://blog.golang.org/json-and-go ,里面这个例子跟我之前想描述的差不多:


    f = map[string]interface{}{
    "Name": "Wednesday",
    "Age": 6,
    "Parents": []interface{}{
    "Gomez",
    "Morticia",
    },
    }

    m := f.(map[string]interface{})


    for k, v := range m { //每次都这样搞一下
    switch vv := v.(type) {
    case string:
    fmt.Println(k, "is string", vv)
    case int:
    fmt.Println(k, "is int", vv)
    case []interface{}:
    fmt.Println(k, "is an array:")
    for i, u := range vv {
    fmt.Println(i, u)
    }
    default:
    fmt.Println(k, "is of a type I don't know how to handle")
    }
    }
    9
        26
    9  
    OP
       2014 年 1 月 29 日
    @Livid v2ex 其他地方该改的都改过了,只有这个回复框万年不变,难道没有支持代码编辑的打算吗,程序员的论坛不支持代码编辑真的很难受。只能通过第三方的嵌入这是一个好主意吗。

    像这种做之前就可以预见必定大受欢迎的功能 (为何这么肯定?统计贴代码的帖子有多少就知道),为何不做呢?
    congjunfeng
        27
    congjunfeng  
       2014 年 1 月 29 日   1
    @9 如果用go重构PHP的项目,还用PHP的思路的以及业务逻辑的话,真的很容易就掉坑里面了。我没研究过PHP,不过这两个相差太大,一定不要用PHP的思路来做,不然很难看到Go好的地方,而PHP好的地方,go不一定有,所以就一定会感觉越来越坑。。。。
    congjunfeng
        28
    congjunfeng  
       2014 年 1 月 29 日
    @9 我用JSON都是用的struct,还真没用过map
    9
        29
    9  
    OP
       2014 年 1 月 29 日
    @congjunfeng json 结构是不确定的,用 struct 可能要经常变动,所以就用 map 了
    reusFork
        30
    reusFork  
       2014 年 1 月 29 日
    sodatea
        31
    sodatea  
       2014 年 1 月 29 日
    @Yiner python 是强类型、动态类型语言。请自行搜索以搞清楚「强类型 | 弱类型」、「静态类型 | 动态类型」这几种概念的具体含义……
    wayn3h0
        32
    wayn3h0  
       2014 年 1 月 29 日
    @9 重复性的功能,写成一个函数,用断言或建议看一下reflect包
    @luikore 还是给个例子看看
    a7a2
        33
    a7a2  
       2016 年 12 月 30 日
    写吧 多写点 以后就可以复制粘贴了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1086 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 18:18 PVG 02:18 LAX 10:18 JFK 13:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86