zoukankan      html  css  js  c++  java
  • Go构建工程入门1(了解即可,现在推荐使用Go module)

    在Go的官网文档How to Write Go Code中,已经介绍了Go的项目目录一般包含以下几个:

    • src 包含项目的源代码文件;
    • pkg 包含编译后生成的包/库文件;
    • bin 包含编译后生成的可执行文件。

    一般,bin和pkg目录可以不创建,go命令会自动创建(如 go install),只需要创建src目录即可。对于pkg目录,一开始我犯了这样的错误——”我把Go中的包放入pkg下面,怎么不行啊?“我直接把Go包的源文件放入了pkg中。这显然是不对的。pkg中的文件是Go编译生成的(一般文件后缀.a),而不是手动放进去的。

    下面以一个简单的例子进行说明。(Windows环境,在命令行下进行实验,而不是使用IDE。我使用的终端工具是cmder)
    当前的项目在D:workspacegodemo下,其目录结构如下:

    ├─godemo 
    │  └─src
    │      ├─config
    |          |-- config.go
    │      └─main
    |          |-- main.go
    

    源文件如下:
    // config.go

    package config
    
    import "fmt"
    
    func LoadConfig()  {
       fmt.Println("loading config...")
    }
    

    // main.go

    package main
    
    import (
       "fmt"
       "config"
    )
    
    func main() {
       config.LoadConfig()
       fmt.Println("this is main pkg")
    }
    

    此时使用 go build 进行构建,会发生如下错误:

    D:workspacegodemo                                             
    λ go build srcmainmain.go                                     
    srcmainmain.go:5:2: cannot find package "config" in any of:   
            D:softGosrcconfig (from $GOROOT)                    
            D:workspacegoshopsrcconfig (from $GOPATH)           
    

    从输出中我们可以看到,Go先是从 (GOROOT** 中查找包"config",如果没找到,就从 **)GOPATH 中查找,结果都没有找到。

    我们可以使用 go env 输出Go的环境变量设置,如下:

    λ go env                                           
    set GOARCH=amd64                                   
    set GOBIN=                                         
    set GOCACHE=C:UsersmaoAppDataLocalgo-build    
    set GOEXE=.exe                                     
    set GOFLAGS=                                       
    set GOHOSTARCH=amd64                               
    set GOHOSTOS=windows                               
    set GOOS=windows                                   
    set GOPATH=D:workspacegoshop                     
    set GOPROXY=                                       
    set GORACE=                                        
    set GOROOT=D:softGo                              
    set GOTMPDIR=                                      
    set GOTOOLDIR=D:softGopkg	oolwindows_amd64    
    set GCCGO=gccgo                                    
    set CC=gcc                                         
    set CXX=g++                                        
    set CGO_ENABLED=1                                  
    set GOMOD=                                         
    set CGO_CFLAGS=-g -O2           
    ...省略...     
    

    那么这里的GOROOT和GOPATH环境变量到底有何作用呢?在官方文档中已经说明:

    The GOPATH environment variable specifies the location of your workspace. It defaults to a directory named go inside your home directory, so $HOME/go on Unix, $home/go on Plan 9, and %USERPROFILE%go (usually C:UsersYourNamego) on Windows.

    If you would like to work in a different location, you will need to set GOPATH to the path to that directory. (Another common setup is to set GOPATH=$HOME.) Note that GOPATH must not be the same path as your Go installation.

    GOPATH 环境变量明确了工作目录的位置,在Windows环境下,默认的GOPATH为%USERPROFILE%go (通常为 C:UsersYourNamego),由于我在最初安装Go的时候修改这一值,从上面可以看到,我的GOPATH为 D:workspacegoshop 。但此时,我的项目并非构建在这个目录下,所以导包的时候系统无法找到。

    我们可以通过如下命令设置,修改成新的环境变量。

     setx GOPATH "%GOPATH%;D:workspacegodemo"
    

    (注:这个命令会针对GOPATH环境变量追加写入一个新的变量值,即"D:workspacegodemo",此外还可以在图形化界面中添加新的GOPATH值。执行该命令后应重启控制台,以便让环境变量生效。)

    通过执行 go env GOPATH 命令(该命令查看系统当前可用的 GOAPTH 路径),如下:

    D:workspacegodemo
    λ go env GOPATH
    D:workspacegoshop;D:workspacegodemo
    

    此时再次执行 go build 命令,就不会出错了。如下:

    D:workspacegodemo
    λ go build srcmainmain.go
    
    D:workspacegodemo
    λ ls
    main.exe*  src/
    
    D:workspacegodemo
    λ main.exe
    loading config...
    this is main pkg
    

    虽然运行成功,可执行文件main.exe并不是生成在bin目录下(这似乎并不符合本文开头所述),而是生成在执行 go build 这条语句的相应目录下。为了符合规范,则需要使用 go install 工具。命令go install 用于编译并安装指定的代码包及它们的依赖包。当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。与go build命令一样,传给go install命令的代码包参数应该以导入路径的形式提供。并且,go build命令的绝大多数标记也都可以用于go install命令。实际上,go install命令只比go build命令多做了一件事,即:安装编译后的结果文件到指定目录。

    D:workspacegodemo                                                                    
    λ ls                                                                                   
    src/                       # --> 当前目录下只有 src/                                                                             
                                                                                           
    D:workspacegodemo                                                                    
    λ go install srcconfig                                                               
    can't load package: package src/config: cannot find package "src/config" in any of:    
            D:softGosrcsrcconfig (from $GOROOT)                                       
            D:workspacegoshopsrcsrcconfig (from $GOPATH)                              
            D:workspacegodemosrcsrcconfig                                             
                                                                                           
    D:workspacegodemo                                                                    
    λ go install config main  # --> go install 后面直接跟包名                                                           
                                                                                           
    D:workspacegodemo                                                                    
    λ ls                                                                                   
    bin/  pkg/  src/            # --> 最后生成了 bin/ pkg/ 目录           
    

    现在整个项目的目录结构如下:

    ├─godemo 
    |  └─bin
    |      |-- main.exe
    |  └─pkg
    |      |-- windows_amd64
    |                    |-- config.a*
    │  └─src
    │      ├─config
    |          |-- config.go
    │      └─main
    |          |-- main.go  
    

    (全文完)


    参考:
    1、https://golang.org/doc/code.html#Workspaces (官方文档)
    2、https://blog.csdn.net/belalds/article/details/80076817

  • 相关阅读:
    Flesch Reading Ease(模拟)
    实验一:词法分析设计
    java—容器学习笔记
    [转载]马士兵Java视频教程 —— 学习顺序
    Java的安装过程
    编程之美初赛第一场
    RCC 2014 Warmup (Div. 2)
    ural 1017. Staircases(dp)
    ural 1012. K-based Numbers. Version 2(大数dp)
    ural 1009. K-based Numbers(简单dp)
  • 原文地址:https://www.cnblogs.com/kkbill/p/13049443.html
Copyright © 2011-2022 走看看