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

不懂就问: go 的导包规则

  •  
  •   gramyang · 2019-07-02 10:04:11 +08:00 · 4148 次点击
    这是一个创建于 2005 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为对 Java 比较熟悉,所以产生了这个疑问:

    为什么我看到很多开源项目里的代码,同一个项目内的包引用都要 import github 的绝对路径,而不使用项目的根路径呢?

    或者说使用项目根路径有什么弊端?

    开发工具是 goland

    19 条回复    2019-07-03 12:38:05 +08:00
    linhongye
        1
    linhongye  
       2019-07-02 10:08:59 +08:00 via Android
    如果你想看懂 go,
    为什么不花 30 分钟看个基础呢?
    你光问一个 import 怎么用,你还是看不懂 go 的。
    monsterxx03
        2
    monsterxx03  
       2019-07-02 10:10:48 +08:00
    用 github 路径可以支持 go get, 项目根路进不行, 有了 go mod 后,我自己的项目都用根路径了.
    Muninn
        4
    Muninn  
       2019-07-02 10:29:28 +08:00   ❤️ 1
    官方说不推荐相对路径,大家就养成习惯了呗。

    注意这里的相对路径也不是相对于当前文件的,没用 go mod 是相对于 gopath,用了是相对于 mod 文件里声明的 package

    因为 golang 没有中心仓库,package 都在互联网的各处,内网也没办法弄一个 mirror,所以基本没有内网写 golang 的需求。
    gramyang
        5
    gramyang  
    OP
       2019-07-02 10:34:48 +08:00
    @Muninn 和群里面讨论了一下,我的一点总结:
    因为 go 是没有项目概念的,所有的代码都在 gopath/src 下可以相互引用,相当于 gopath/src 就是一个大项目,但是这样会很麻烦,项目会分不开,所有就有了 gomodule,把项目区分开,区分的方式就是以 go.mod 文件所在目录为项目根目录。

    结论就是:用 go mod 之前,import 最好用绝对路径,而且是 github 开头的路径。用了 go mod 之后,路径随意了,因为有了包的概念。
    misaka19000
        6
    misaka19000  
       2019-07-02 10:35:46 +08:00
    java 不也是用的绝对路径,项目绝对路径不就保证所有代码不会冲突了吗
    Oktfolio
        7
    Oktfolio  
       2019-07-02 10:37:25 +08:00
    Java 又不会把所有包都存在一个目录( gopath )
    lazyfighter
        8
    lazyfighter  
       2019-07-02 10:46:28 +08:00
    java 是 classpath 下面,go 是 gopath 下面,因此本质是一样的
    liuxey
        9
    liuxey  
       2019-07-02 10:51:00 +08:00
    com.github.xx.yy 和 github.com/xx/yy 本质没区别
    shawndev
        10
    shawndev  
       2019-07-02 11:03:05 +08:00
    因为相对路径在更新项目后可能会失败,也可能机缘巧合的不失败。让错误早点发生就能早点解决。
    shawndev
        11
    shawndev  
       2019-07-02 11:04:08 +08:00
    另外不一定是 github 绝对路径,比如 b 站开源出现的 go-common 模块。
    tcpdump
        12
    tcpdump  
       2019-07-02 11:10:30 +08:00
    @gramyang 这点真的很坑,初入的都是懵逼
    littlewing
        13
    littlewing  
       2019-07-02 11:29:28 +08:00 via iPhone
    请使用 go mod
    maxmin
        14
    maxmin  
       2019-07-02 12:43:52 +08:00
    一般都是以 go 的 src 的相对路径吧 .
    fuckshit
        15
    fuckshit  
       2019-07-02 13:10:23 +08:00
    用`go mod`吧,golang 官方出的依赖管理工具。

    mlog.club/topic/9
    ruyuejun
        16
    ruyuejun  
       2019-07-02 13:27:34 +08:00
    @tcpdump 同感吧,我第一次做的时候也是摸了很久。
    基本上,我所在的 QQ 群,微信群,社区,每天(是每天!)都有这个问题出现,我已经被问的崩溃了,我把我的 github 笔记发出去无数次,无济于事,每天,甚至每小时都会有这个问题的讨论
    linhongye
        17
    linhongye  
       2019-07-03 03:36:21 +08:00 via Android   ❤️ 1
    @ruyuejun
    友情提醒, 你的 github 连接里多了一个字母 i …
    koebehshian
        18
    koebehshian  
       2019-07-03 09:10:42 +08:00
    现问是不是,再问为什么。
    ruyuejun
        19
    ruyuejun  
       2019-07-03 12:38:05 +08:00
    @linhongye 这都看到了,感谢小哥哥.....
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2792 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:38 · PVG 21:38 · LAX 05:38 · JFK 08:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.