V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
darasion
V2EX  ›  Go 编程语言

遇到包名和变量名相互占用的问题。大家都是怎么解决的?

  •  
  •   darasion · 2016-03-31 09:38:26 +08:00 · 1813 次点击
    这是一个创建于 3158 天前的主题,其中的信息可能已经有所发展或是发生改变。
    标题用 “占用” ,而没有用 “冲突”,是为了强调取名费劲,不是指语言本身不能解决这种冲突。

    --
    举个例子,
    假设我把有关机器各种操作的代码放在一个叫 host 的包里,然后 有个叫 Host 的 struct 。

    在调用它的代码中,经常会操作 host.Host 类型的列表(slice 、 map...),很容易写成:
    for _, host := range hosts { ... }
    这样 host 变量和 host 包名就产生冲突了,接下来循环{}内部就没办法使用 host.XXX 来声明其他变量了。短变量名考虑过 h 之类,但有时候 err != nil 这种判断多了会导致循环体非常长,短名字很容易混淆。

    --
    阅读了一下其他代码,发现有这样的特点,不知道是否可以作为参考:
    包名如果是名词,就用不可数名词,或者不经常可数的,比如 json 、 time 、 http ....
    于是我想是不是可以给包名取一个叫 cloud 这种,美其名曰 “云”。。。

    --
    具体问题:
    1. 如何给包命名才能保证不入侵其他名字空间?
    2. 根据什么把一段代码拆成一个包?
    6 条回复    2016-03-31 22:18:30 +08:00
    orvice
        1
    orvice  
       2016-03-31 10:20:22 +08:00
    import hostLib "/path/to/host" 这样?
    darasion
        2
    darasion  
    OP
       2016-03-31 10:36:46 +08:00
    @orvice 那多难看呃,并且每次都得强制的改个名字,好麻烦。
    orvice
        3
    orvice  
       2016-03-31 10:52:43 +08:00
    @darasion 不然 for 写的时候就别用 host, k,v := range hosts 这样。。。
    calease
        4
    calease  
       2016-03-31 11:46:18 +08:00   ❤️ 2
    不要用 generic 的词做 package name 。
    generic 的词像 host,json,time 是 reserve 给语言和 code 本身的。
    如果你的 project name 是 abc , package name 可以叫 abchost
    janxin
        5
    janxin  
       2016-03-31 20:31:34 +08:00 via iPhone
    用过 net/url 库嘛…
    darasion
        6
    darasion  
    OP
       2016-03-31 22:18:30 +08:00
    @janxin 用过 net/url 。

    有过同样的问题,当时用的少而已。
    url 经常会被变量用到,所以变量名经常改叫 link 。但很多时候包名找不到那么多好写的近义词。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3013 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:48 · PVG 18:48 · LAX 02:48 · JFK 05:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.