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-01-28 16:56:46 +08:00 · 5794 次点击
    这是一个创建于 3937 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如用关联数组, map[string]interface{}, 最简单的循环操作却报错,要加上类型断言 --- 一次两次还好,每次都这样搞快崩溃了!关联数组存在不同类型的数据不是很正常的吗,求经验

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

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

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

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

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

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

    @wayn3h0 需要输出 json 数据,然后 id 在输出前要拿它做很多工作,描述能力有限,但是非常感谢回复,我会好好学习的。
    cnbuff410
        19
    cnbuff410  
       2014-01-29 09:42:49 +08:00
    楼主问一个Go的问题,就有不少不用Go的友人跑过来冷嘲热讽。这是什么样的精神啊。
    pubby
        20
    pubby  
       2014-01-29 10:04:41 +08:00
    昨天遇到一个坑
    fp,_ := os.Open(...)
    fp.ReadAt(buf,1000) 之后文件指针没移动(文档中没有指出这点0)
    fp.Seek(0,1) 得到的当前读写位置还是0
    davepkxxx
        21
    davepkxxx  
       2014-01-29 10:48:46 +08:00
    我试用了一段时间之后就继续回去玩scala了,go吸引我的就只剩多返回值这一点了。
    zonyitoo
        22
    zonyitoo  
       2014-01-29 12:26:58 +08:00
    我用了一阵子Go发现很多坑,不过依然在坚持用,因为它很像C,用起来挺亲切的。不过相比一直喜爱的Python,Go用得实在是憋屈
    luikore
        23
    luikore  
       2014-01-29 12:45:18 +08:00
    @wayn3h0 你是没写过处理大量 json 的程序吧... 一堆 for 面条代码过后都看不出是干嘛的指的就是那种"方便"的代码
    Yiner
        24
    Yiner  
       2014-01-29 14:56:45 +08:00
    @tonyseek Python本来就不是强类型~
    9
        25
    9  
    OP
       2014-01-29 15:40:44 +08:00
    @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-01-29 16:01:24 +08:00
    @Livid v2ex 其他地方该改的都改过了,只有这个回复框万年不变,难道没有支持代码编辑的打算吗,程序员的论坛不支持代码编辑真的很难受。只能通过第三方的嵌入这是一个好主意吗。

    像这种做之前就可以预见必定大受欢迎的功能 (为何这么肯定?统计贴代码的帖子有多少就知道),为何不做呢?
    congjunfeng
        27
    congjunfeng  
       2014-01-29 16:07:20 +08:00   ❤️ 1
    @9 如果用go重构PHP的项目,还用PHP的思路的以及业务逻辑的话,真的很容易就掉坑里面了。我没研究过PHP,不过这两个相差太大,一定不要用PHP的思路来做,不然很难看到Go好的地方,而PHP好的地方,go不一定有,所以就一定会感觉越来越坑。。。。
    congjunfeng
        28
    congjunfeng  
       2014-01-29 16:08:30 +08:00
    @9 我用JSON都是用的struct,还真没用过map
    9
        29
    9  
    OP
       2014-01-29 16:55:58 +08:00
    @congjunfeng json 结构是不确定的,用 struct 可能要经常变动,所以就用 map 了
    reusFork
        30
    reusFork  
       2014-01-29 17:06:47 +08:00
    sodatea
        31
    sodatea  
       2014-01-29 20:21:39 +08:00
    @Yiner python 是强类型、动态类型语言。请自行搜索以搞清楚「强类型 | 弱类型」、「静态类型 | 动态类型」这几种概念的具体含义……
    wayn3h0
        32
    wayn3h0  
       2014-01-29 20:36:15 +08:00
    @9 重复性的功能,写成一个函数,用断言或建议看一下reflect包
    @luikore 还是给个例子看看
    a7a2
        33
    a7a2  
       2016-12-30 17:32:39 +08:00
    写吧 多写点 以后就可以复制粘贴了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2789 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:00 · PVG 10:00 · LAX 18:00 · JFK 21:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.