Golang- import 导入包的语法

一 包的导入语法
     在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下:
      import(
         "fmt"
     )
    然后在代码里面可以通过如下的方式调用
      fmt.Println("hello world")
   
       上面这个fmt是Go语言的标准库,他其实是去GOROOT下去加载该模块,当然Go的import还支持如下两种方式来加载自己写的模块:
      相对路径     import   "./model"  //当前文件同一目录的model目录,但是不建议这种方式import
      绝对路径    import   "shorturl/model"  //加载GOPATH/src/shorturl/model模块

     上面展示了一些import常用的几种方式,但是还有一些特殊的import,让很多新手很费解,下面是三种导入包的使用方法。

      1. 点操作   有时候会看到如下的方式导入包     import( . “fmt” ) 
这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println(“hello world”)  可以省略的写成Println(“hello world”)
      2. 别名操作   别名操作顾名思义可以把包命名成另一个用起来容易记忆的名字
           import( f “fmt” )   别名操作调用包函数时前缀变成了重命名的前缀,即f.Println(“hello world”)
      3.  _操作   这个操作经常是让很多人费解的一个操作符,请看下面这个import
          import ( “database/sql” _ “github.com/ziutek/mymysql/godrv” ) 

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


二 包的导入过程说明
        程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。下图详细地解释了整个执行过程:


通过上面的介绍我们了解了import的时候其实是执行了该包里面的init函数,初始化了里面的变量,_操作只是说该包引入了,只初始化里面的init函数和一些变量,不能通过包名来调用其它的函数,这有什么用呢?往往这些init函数里面是注册自己包里面的引擎,让外部可以方便的使用,就很多实现database/sql的引起,在init函数里面都是调用了sql.Register(name string, driver driver.Driver)注册自己,然后外部就可以使用了。

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在 Go 语言中,导入import)和其他文件的机制使得我们可以组织大项目并避免命名冲突。导入的关键在于正确的路径。 ### 基本语法: ```go import "path/to/package" ``` 在这个例子中,“path/to/package”代表了目标的完整路径,通常是从根目录开始的相对路径。Go 标准库提供的通常直接引用,如 `fmt`、`os` 等,并不需要完整的路径。 ### 使用 `import` 关键字: 当你在一个 Go 源文件中需要使用另一个源文件中的功能时,你需要通过 `import` 关键字引入该源文件所在的。例如,如果你想导入名为 `example.go` 的文件,首先需要确保这个文件是在当前项目的某个目录下。如果它位于 `/code/examples/example.go`,则导入语句应该是: ```go package main import "/code/examples/example" ``` 请注意,在实际项目中,文件名通常含于 `main.go` 或者其它主程序入口文件中,而不是单独作为一个导入模块存在。因此,导入其他 Go 文件的典型场景是在含业务逻辑或特定功能实现的文件之间共享功能。 ### 实现示例: 假设我们有三个文件结构如下: - `/code` - `/code/models` - `/code/models/person.go` `person.go` 可能含了一个 `Person` 结构体和一些相关方法。为了在主程序文件中使用 `Person`,可以像下面这样导入: ```go // 主程序入口文件:main.go package main import ( "fmt" "code/models" ) func main() { person := models.Person{Name: "John Doe"} fmt.Println(person.GetName()) } ``` 在这里,`models.Person` 被导入以便在 `main` 函数中实例化 `Person` 类型的对象。 ### 相关问题: 1. **如何处理导入时的依赖循环**? - 当两个相互依赖导致无法解析时,可以通过调整导入顺序,或使用 `require()` 来解决。 2. **Go 中的是如何组织文件的**? - 内的所有 `.go` 文件都会组成一个单层目录结构,每个目录对应一个。 3. **如何管理大型项目导入关系**? - 对于大型项目,建议使用工具如 `dep` 或 `go mod` 来帮助管理和跟踪依赖关系,尤其是当涉及到多个供应商的依赖项时。这些工具能够自动处理版本控制、依赖图生成等复杂操作。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值