专栏首页aoho求索夯实基础:Go 语言包依赖管理

夯实基础:Go 语言包依赖管理

温馨提示:本文内容较为基础,适合刚入门或者想要了解 Go 语言的同学。

前文回顾

在前面系列文章中,我们对 Go 的基础语法和一些简单的特性进行介绍,如数据类型、容器等。本文开始,我们将对 Go 中的一些高级特性进行介绍,包括包管理、反射、并发等。

代码的高复用性是优秀代码必备的品质,而 Go 的包管理就为我们封装模块和复用代码提供了强有力的帮助。

Go 是一门静态强类型语言,在程序编译的过程中会把变量的反射信息如字段类型、类型信息等写入可执行文件中。在程序执行的过程中,虚拟机会加载可执行文件中变量的反射信息,并提供接口用于在运行时获取和修改能力。

Go 支持两种并发形式,一种是我们常见的共享内存并发模型和 Go 推荐使用的 CSP (顺序进程通信) 并发模型。Go 使用了一种特殊的 MPG 线程实现模型,使得可以原生态支持并发,大大提供了程序的执行效率。

本系列文章,我将会进一步加深对 Go 语言的讲解,更一步介绍 Go 中的包管理、反射和并发等高级特性,本文将会介绍 Go 包依赖管理相关的应用实践。

依赖管理

Go 的代码复用很大程度依赖于包基础上,而包管理很大程度依赖于 GOPATH。Go 的包管理一直饱受诟病,不过自 1.11 版本发布 Go Modules 以来已经出现很大程度的改善。本文我们将初步了解 Go 的包管理。

包管理

与大多数的编程语言一致,Go 中同样存在包的定义,我们可以通过 package 关键字定义一个包。如下代码所示:

package main

import "fmt"

func main()  {

 fmt.Println("Hello World")

}

我们通过 package 关键字定义了 main 包,在 Go 中规定主函数 #main 必须位于 main 包下。引入包可以使用 import 关键字,引入多个包可以将它们放置在括号内一块引入,如下所示:

import (
 "fmt"
  "os")

在同一个包内定义的 func、type、变量、常量,在该 package 下的所有文件下的代码都可以随意访问,属于包内公开。我们在 main 目录下新建一个 hello.go 文件,在里面添加一个 #sayHello 的函数,代码如下所示:

package main

import "fmt"

func sayHello()  {
 fmt.Println("Hello World")
}

它和 main.go 同属于 main 包下,我们可以 main.go 中直接使用 #sayHello 函数,代码如下所示:

package main

func main()  {
 sayHello()
}

由于我们需要同时编译 main.go 和 hello.go 文件,在 main 目录下执行以下命令:

go run main.go hello.go

即可以在命令行输出预期的 "Hello World" 字段。

如果func、type、变量、常量位于不同的包下,就需要将它们名称的首写字母大写,表示它们是公开可访问的。对结构体下的字段,如果想要在包外访问,也需要将变量名首字母大写。

我们在 main 目录同级创建一个新的目录 compute,在 compute目录下新建 add.go 文件,add.go 文件的代码如下所示:

package compute

type AddOperator interface {

 /**
  * 算术相加  
  */
 Add() interface{}

}

type IntParams struct{
 P1 int  // 加数
 P2 int  // 被加数
}

func (params *IntParams) Add() interface{} {
 return params.P1 + params.P2
}

我们通过 package compute 将 add.go 归属于 compute 包下;定义了 AddOperator 接口,接口中只有一个方法 #Add 用于进行算数相加操作;同时定义了 IntParams 结构体用于实现 AddOperator#Add,将 IntParams 内包含的两个整数进行相加并返回结果。

可以注意到,add.go 中的接口、函数、结构体以及结构体下的字段的首字母都是大写的,这表示它们都是公开的,可以在包外访问到。接着我们修改一下 main 包下的 main 函数,让它引用并使用 compute 包下定义的结构体和函数,代码如下所示:

package main

import (
 "ch4-feature/compute"
 "fmt"
)

func main()  {

 params := &compute.IntParams{
  P1:1,
  P2:2,
 }
 fmt.Println(params.Add())

}

我们熟悉在在 import 引入了 ch4-feature/compute 包,接着在 main 函数中直接声明并初始化了 IntParams,最后还调用了 #Add 方法返回结果,在 main 目录下的命令行中执行:

go run main.go

Go 就会为我们同时编译 main.go 和 compute 包,执行 main 函数并返回预期的结果 3。

小结

本文主要介绍了 Go 语言的包依赖管理。与其他语言一样,Go 语言通过 package 关键字定义一个包。在同一个包内定义的func、type、变量、常量,在该 package下的所有文件下的代码都可以随意访问,属于包内公开。我们通过 package 关键字定义 main 包,在 Go 中规定主函数 #main 必须位于 main 包下。

下一篇文章将会继续介绍 GOPATH 相关的内容。

本文分享自微信公众号 - aoho求索(aohoBlog),作者:cangwu

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Go语言基本环境变量与依赖管理

    最近开始系统学习一下Golang这么新语言,记录一下它的基本环境变量配置以及依赖管理方式。编写本文的时候使用的Golang版本为go1.13.5 windows...

    Throwable
  • 夯实基础:Go 语言匿名函数和闭包的应用实践

    前面的文章主要介绍了 Go 语言中函数声明和参数传递。本文将会继续介绍匿名函数和闭包相关的概念以及使用方法。

    aoho求索
  • Go语言实战笔记(一)| Go包管理

    这本是In Action系列的书籍,这个系列做研发的都知道,在研发届评价很多,很多新的技术、语言等都会有一本实战的书籍。既然是实战,那么这本书假设了他的读者有了...

    飞雪无情
  • 夯实基础:Go 语言函数声明和参数传递

    前面的文章主要介绍了 Go 语言中提供的常用容器,包括数组、切片,列表和字典等,还介绍了这些容器的遍历方法。本文开始将会介绍 Go 语言中相关的函数和接口。

    aoho求索
  • 夯实基础:Go 语言结构体和方法的应用实践

    前面的文章主要介绍了 Go 语言中函数和接口相关的使用实践。与 C 语言类似,Go 语言 提供结构体类型。结构体作为一种复合类型,由多个字段组成,每个字段都具备...

    aoho求索
  • Go 并发实战--协程浅析 一

    在说go协程之前,先对比看一下进程&线程&协程这几个基础的概念。 进程是指一段程序的执行过程,具有自己的地址空间(包括文本区域(text region)、数据...

    邹志全
  • go语言基础9-错误处理和资源管理

    吐吐吐吐吐葡萄皮
  • 【初识Go】| Day9 包管理

    现在随便一个小程序的实现都可能包含超过10000个函数。然而作者一般只需要考虑其中很小的一部分和做很少的设计,因为绝大部分代码都是由他人编写的,它们通过类似包或...

    yussuy
  • xmake v2.3.6 发布, 新增fortran编译支持

    这个版本重点对其他语言的支持做了一些改进,比如新增了fortran的编译支持,zig语言的实验性支持,另外对golang/dlang增加了第三方依赖包支持以及交...

    ruki
  • 证明谷歌Go魅力的10个开源项目

    原文标题:10 open source projects proving the power of Google Go,作者:Serdar Yegulalp

    Lemon黄
  • Go 包管理机制深入分析

    随着 Go 语言的深入使用,其依赖管理机制也一直是各位 Gopher 热衷于探讨的话题。Go 语言的源码依赖可通过 go get 命令来获取,但自动化程度不高,...

    JFrog杰蛙科技
  • 漫谈依赖管理工具:从Maven,Gradle到Go

    我是攻城师
  • Go 模块存在的意义与解决的问题

    作者:William Kennedy | 原文:Modules Part 01: Why And What

    波罗学
  • golang 开源后台管理系统

    go-admin是一个go语言开发的后台管理系统,该系统以角色为基础的权限管理设计(RBAC),完成了系统管理模块功能的开发(其他示例模块后续加上),采用前后端...

    孤烟
  • GoCenter助力Golang全速前进

    Go语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。为了方便搜索和识别,有时会将其称为Golang。自2009年11月Go...

    JFrog杰蛙科技
  • go modules:使用 mod 管理项目依赖包,通过vendor实现一键分发编译包

    在go语言1.11版本之前,没有modules机制,所有软件包都在安装在$GOPATH/src目录下。不同项目如果引用了同一个软件包的不同版本,就会造成编译麻烦...

    程序员LIYI
  • 亿万级的 go与C高效混合编程!

    今年是 Go 语言诞生的 8 周年,在这个特别的年,Go 语言官方博客发表的纪念刊文称,全球有大约 100 万 Go 开发者,Go 语言在 GitHub 的 2...

    企鹅号小编
  • Go 语言基础入门教程 —— Go 项目基本工程管理示例

    在上一篇教程中,学院君带着大家搭建起了本地开发环境,并且编写了第一个 Go 程序,向世界问好。不过在实际开发过程中,直接调用编译器进行编译和链接(调用 go b...

    学院君
  • Go语言基础

    Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, ...

    刘亦枫

扫码关注云+社区

领取腾讯云代金券