go语言多package使用实战

测试下go多page包调用时是如何实现的,这里测试实战下。
为后面使用go get做准备

首先检查环境:

GOROOT 指向系统安装路径
GOPATH 指向工作路径

在这里插入图片描述

一、同一目录下多个文件共用一个包时

一个路径下只能存在一个package,一个package可以由多个源代码文件组成
api.go

package main

import "fmt"

func Api() {
        fmt.Println("api")
}

main.go

package main

import (
        "fmt"
)

func main() {
        fmt.Println("vim-go")
        //test api
        Api()
}

如上,两个文件都属于同一个main包,直接编译即可。
在这里插入图片描述

二、同一目录多个包时
方式1:通过GOPATH管理多个package

先引入一个知识点。

Go compiler的package搜索顺序
  1. 首先,Go compiler会在GO安装目录(GOROOT,这里Linux安装目录/usr/local/go)下查找是否有src/pkg/hello相关包源码;如果没有则继续;
  2. 如果export GOPATH=PATH1:PAHT2,则Go compiler会依次查找是否存在PATH1/src/hello、PATH2/src/hello;配置在GOPATH中的PATH1和PATH2被称作workplace
  3. 如果在上述几个位置均无法找到hello这个package,则提示出错。
验证测试

这里自己的go版本比较高,所以直接关闭了go mod机制,同时设置GOPATH路径来测试:

➜  main export GOPATH=/data/home/cooperswang/code_study/
➜  main go env GOPATH
/data/home/cooperswang/code_study/
➜  main export GO111MODULE=off
➜  main go env GOPATH
/data/home/cooperswang/code_study/

在这里插入图片描述
代码结构如图:
在这里插入图片描述
这里重点main.go中调用其它packge的方式:
在这里插入图片描述
可以看到,这时采用相对路径的方式实现自定义包的查找,使用的查找顺序如上面的知识点,主要使用了GOPATH路径。

不过这里仍有点不明白,不清楚go查找包到底是怎么起作用的,先记录下吧

方式2:使用Go mod管理多个package

Golang在1.11版本中引入了go mod机制,在统一的位置对依赖进行管理。

go mod不同于以往基于GOPATH和Vendor的构建方式,其主要是通过GOPATH/pkg/mod下的缓存包来对工程进行构建。在Go 1.11中已经可以使用,同以往新添加的功能一样,go mod 可以通过GO111MODULE来控制是否启用,GO111MODULE有一下三种类型。

on 所有的构建,都使用Module机制
off 所有的构建,都不使用Module机制,而是使用GOPATH和Vendor
auto 在GOPATH下的工程,不使用Module机制,不在GOPATH下的工程使用

Go mod化处理步骤

  • 在项目的根目录下使用命令go mod init projectName
  • 在该目录下执行go build main.go

can-i-have-multiple-packages-inside-a-single-go-module-how
建立项目HelloWorld,在顶层目录使用go mod init生成go.mod文件。
在这里插入图片描述
此时go.mod文件:

module HelloWorld

go 1.13

此时hello包和main包内容:

➜  HelloWorld cat src/hello/hello.go
package hello

import "fmt"

func Hello() {
        fmt.Println("hello wsq")
}


➜  HelloWorld cat src/main/main.go
package main

import "HelloWorld/src/hello"

func main() {
        hello.Hello()
}

此时,在HelloWorld目录下,编译即可:
在这里插入图片描述

 1. 在非main包中go build 执行时,编译生成.a文件;go install可以看到生成在GOPATH/pkg下
 2. 在main包中go build执行时,生成main文件;go install可以看到生成再GOPATH/bin下
三、 包机制导入机制
  1. 如果一个main导入其他的包,包会被顺序导入
  2. 如果导入的包(pkg1)依赖其他的包(包pkg2),会首先导入pkg2,然后初始化pkg2中的常量与变量,如果pkg2中有init函数,会自动执行init
  3. 所有包导入完成后才会对main的常量和变量进行初始化,然后执行main中的init函数(如果有的话),最后执行main函数
  4. 如果一个包被导入多次实际上只会导入一次

```

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Go语言中,使用关键字"package"来定义一个包,而"main"则是一个特殊的包名,表示这个包是一个可执行程序的入口包。因此,在Go语言中,当我们使用"package main"时,它会被标记为红色,表示这是一个特殊的包名。 ### 回答2: 在Go语言中,当我们声明一个文件为可执行文件时,需要在文件的顶部声明package main。这是因为在Go语言中,所有可执行程序都必须包含一个main函数,作为程序的入口。 当我们在一个文件中声明了package main时,编译器会将该文件视为一个可执行文件,并且在编译时会检查该文件是否符合程序入口的标准。如果文件中未声明main函数,则编译器会抛出错误,并将package main标红。 package main标红的原因通常是文件中缺少main函数或main函数的定义不正确。要解决这个问题,我们需要确保在文件中声明了package main,并且在其下方定义了正确的main函数。 正确的main函数应该是这样的: func main() { // your code here } 在main函数中,我们可以执行任何我们需要执行的操作。例如,我们可以打印输出、读取数据、启动goroutine等。 总之,当我们在开发Go语言程序时,务必要注意在文件的顶部声明package main,并且确保我们的main函数符合程序入口的标准。这样才能确保我们的程序能够正确编译并运行,避免出现package main标红的问题。 ### 回答3: go语言中的package main是一个特殊的包名,它表示一个可执行的程序,也是go语言程序的入口。当代码中的package main标红时,一般有以下几个原因: 1. 代码中没有被main函数调用的其他函数或变量。在go语言中,未被调用的函数或变量是无效的,编译器会认为这些部分没有被实际使用,因此标红。 2. 缺少必要的依赖包。在函数中使用了其他依赖包中的函数或变量,但是没有正确引入这些依赖包。解决方法是通过import语句引入依赖包。 3. 代码语法错误。常见的错误包括拼写错误、语句错误、符号未关闭等。 在解决package main标红时,可以通过以下方法逐一排查。首先检查代码中可能存在的语法错误,如果没有错误可以逐一检查是否缺少依赖包或未被调用的函数或变量,最终将代码修复即可。 需要注意的是,在代码解决package main标红后,应该再进行一次编译和测试,以确保代码没有其他问题。同时,为了避免出现不必要的问题,建议在编写代码的过程中严格审查并及时修正代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值