理解 Golang 通过 import 导入包

可跳转至 Caius的个人网站 阅读

一 ,基本语法

   import(
       "fmt"
   )
  //然后在代码里面可以通过如下的方式调用
  fmt.Println("hello world")

上面这个fmt是Go语言的标准库,他其实是去GOROOT下去加载该模块,当然Go的import还支持如下两种方式来加载自己写的模块:

  //相对路径     
  import   "./test_model"  //当前文件同一目录的test_model目录,但是不建议这种方式import
  
  //绝对路径    
  import   "mygoproject/test_model"  //加载GOPATH/src/mygoproject/test_model模块   

点操作

import . "fmt"

这个点操作的含义就是这个包导入之后在调用这个包的函数时,可以省略前缀的包名

  fmt.Println("hello world")  
  //可以省略的写成
  Println("hello world")

别名操作

别名操作顾名思义可以把包命名成另一个用起来容易记忆的名字

  import( f "fmt" )   
  //别名操作调用包函数时前缀变成了重命名的前缀,即
  f.Println("hello world")

_ 操作

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "time"
)  
//_ 操作其实只是引入该包。当导入一个包时,它所有的init()函数就会被执行,但有些时候并非真的需要使用这些包,仅仅是希望它的init()函数被执 行而已。
// 这个时候就可以使用_操作引用该包了。即使用_操作引用包是无法通过包名来调用包中的导出函数,而是只是为了简单的调用其init函数()。

二,模块路径导入

随着 Go Modules 的引入,Go 项目越来越倾向于使用模块来管理依赖关系。在一个使用 Go Modules 的项目中,通过写入相对路径,Go 编译器会尝试在 GOPATH 中寻找包,但这样的做法在模块化的环境下不再推荐。

下面分两种情况来理一下吧,一种情况是在同一个项目中的两个包,另一中情况是不在同一个项目的两个包

同一个项目中的两个包

目录结构如下,我们要在moduledemo/main.go中调用了mypackage这个包

moduledemo
├── go.mod
├── main.go
└── mypackage
    └── mypackage.go

moduledemo/go.mod中按如下定义:

module moduledemo

go 1.20

然后在moduledemo/main.go中按如下方式导入mypackage

package main

import (
	"fmt"
	"moduledemo/mypackage"  // 导入同一项目下的mypackage包
)
func main() {
	mypackage.New()
	fmt.Println("main")
}

不在同一个项目的两个包

目录结构如下:

├── moduledemo
│   ├── go.mod
│   └── main.go
└── mypackage
    ├── go.mod
    └── mypackage.go

mypackage/go.mod:

module mypackage

go 1.20

moduledemo/main.go中按如下方式导入:

import (
	"fmt"
	"mypackage"
)
func main() {
	mypackage.New()
	fmt.Println("main")
}

因为这两个包不在同一个项目路径下,想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在go.mod文件中使用replace指令。

在调用方也就是moduledemo/go.mod中按如下方式指定使用相对路径来寻找mypackage这个包。

module moduledemo

go 1.20

require "mypackage" v0.0.0
replace "mypackage" => "../mypackage"

三,重点来了

3.1 import 后跟的是 路径 而不是 包名

每个包是由一个全局唯一的字符串所标识的导入路径定位。出现在import语句中的导入路径也是字符串。

import后面的最后一个元素应该是路径,就是目录,并非包名

包名和目录名没有关系,但是包名最好等于目录名

比如:

import m "lib/math"

m.Sin : m指代的是lib/math路径下唯一的那个包

同一个目录下只能有一种包名

3.2 导入包的重命名

如果我们想同时导入两个有着名字相同的包,例如math/rand包和crypto/rand包,那么导入声明必须至少为一个同名包指定一个新的包名以避免冲突。这叫做导入包的重命名。

import (
    "crypto/rand"
    mrand "math/rand" // alternative name mrand avoids conflict
)
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingCaius

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值