golang package 是什么意思?一份来自初学者的golang package体验指南

21 篇文章 0 订阅
订阅专栏

如果你有其他语言的基础,可见性应该很好理解。
java的可见性是通过public private来描述的。
python的可见性是通过_some_var下划线来约定的。

本文翻译自:https://www.callicoder.com/golang-packages/
为啥老外能把事情说的这么明白。。。
golang中任何一个文件都要属于一个package
多个文件可以属于同一个package
同一个package中可以有两个同名的函数吗?
如何导入一个package
如何导入一个第三方的package
一个包里面含有另一个包可以吗?
包和目录有什么联系吗?
一个包可以有多个init吗?

函数可以用来复用代码。包也是复用代码的一种方式。package把你的go源码文件组织成为一个单个的单元,让你的代码更加模块化,可重用。

在这篇文章中将要学习如何组织代码成为package,如何导入一个包,如何导出包里面的函数,type,或者变量,如何导入第三方包。

Let’s get started!

In the most basic terms, A package is nothing but a directory inside your Go workspace containing one or more Go source files, or other Go packages.

在这里插入图片描述

Every Go source file belongs to a package. 使用下面的语法声明一个源文件属于一个包

package <packagename>

这行代码需要写在源文件的开头。定义在源文件里面的函数,types,变量都会成为这个包的一部分。

You can choose to export a member defined in your package to outside packages, or keep them private to the same package. Other packages can import and reuse the functions or types that are exported from your package.

让我们看一个例子:

import "fmt"

fmt is a core library package that contains functionalities related to formatting and printing output or reading input from various I/O sources. It exports functions like Println(), Printf(), Scanf() etc, for other packages to reuse.

使用package组织代码有如下好处:

  • It reduces naming conflicts. You can have the same function names in different packages. This keeps our function names short and concise.

  • It organizes related code together so that it is easier to find the code you want to reuse.

  • It speeds up the compilation process by only requiring recompilation of smaller parts of the program that has actually changed. Although we use the fmt package, we don’t need to recompile it every time we change our program.

main package和main函数

Go programs start running in the main package. It is a special package that is used with programs that are meant to be executable.

By convention, Executable programs (the ones with the main package) are called Commands. Others are called simply Packages.

The main() function is a special function that is the entry point of an executable program. Let’s see an example of an executable program in Go -

// Package declaration
package main

// Importing packages
import (
	"fmt"
	"time"
	"math"
    "math/rand"
)

func main() {
	// Finding the Max of two numbers
	fmt.Println(math.Max(73.15, 92.46))
	
	// Calculate the square root of a number
	fmt.Println(math.Sqrt(225))

	// Printing the value of `𝜋`
	fmt.Println(math.Pi)

	// Epoch time in milliseconds
	epoch := time.Now().Unix()
	fmt.Println(epoch)

	// Generating a random integer between 0 to 100
	rand.Seed(epoch)
	fmt.Println(rand.Intn(100))
}

导入包

there are two ways to import packages

// Multiple import statements
import "fmt"
import "time"
import "math"
import "math/rand"
// Factored import statements
import (
	"fmt"
	"time"
	"math"
    "math/rand"
)

Go’s convention is that - the package name is the same as the last element of the import path. For example, the name of the package imported as math/rand is rand. It is imported with path math/rand because It is nested inside the math package as a subdirectory.

导出或者不导出

Anything只要是以大写字母开头的,都是可以导出的,outside a package可见。
不是以大写字母开头的,只能在相同的包名内可见

当你import了一个包,你只能访问它的导出的命名
在这里插入图片描述

Creating and managing custom Packages

mdkir packer
cd packer
go mod init github.com/callicoder/packer

目录结构如下图
在这里插入图片描述

源码如下
numbers/prime.go

package numbers

import "math"

// Checks if a number is prime or not
func IsPrime(num int) bool {
    for i := 2; i <= int(math.Floor(math.Sqrt(float64(num)))); i++ {
        if num%i == 0 {
            return false
        }
	}
    return num > 1
}

strings/reverse.go

package strings

// Reverses a string
/*
	Since strings in Go are immutable, we first convert the string to a mutable array of runes ([]rune), 
	perform the reverse operation on that, and then re-cast to a string.
*/
func Reverse(s string) string {
	runes := []rune(s)
	reversedRunes := reverseRunes(runes)
	return string(reversedRunes)
}

strings/reverse_runes.go

package strings

// Reverses an array of runes
// This function is not exported (It is only visible inside the `strings` package)
func reverseRunes(r []rune) []rune {
	for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
		r[i], r[j] = r[j], r[i]
	}
	return r
}

//下面用到了在一个包目录下含有另一个包

strings/greeting/texts.go (Nested package)

// Nested Package
package greeting

// Exported
const  (
	WelcomeText = "Hello, World to Golang"
    MorningText = "Good Morning"
	EveningText = "Good Evening"
)

// Not exported (only visible inside the `greeting` package)
var loremIpsumText = `Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad 
minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea 
commodo consequat.`

main.go (The main package: entry point of our program)

package main

import (
	"fmt"
	str "strings" // Package Alias

	"github.com/callicoder/packer/numbers"
	"github.com/callicoder/packer/strings"
	"github.com/callicoder/packer/strings/greeting" // Importing a nested package
)

func main() {
	fmt.Println(numbers.IsPrime(19))

	fmt.Println(greeting.WelcomeText)

	fmt.Println(strings.Reverse("callicoder"))

	fmt.Println(str.Count("Go is Awesome. I love Go", "Go"))
}
# Building the Go module
$ go build
The above command will produce an executable binary. Let’s execute the binary file to run the program:

# Running the executable binary
$ ./packer
true
Hello, World to Golang
redocillac
2

Things to note

  • Import Paths
  • Package Alias
    You can use package alias to resolve conflicts between different packages of the same name, or just to give a short name to the imported package

在这里插入图片描述

  • Nested Package
    You can nest a package inside another. It’s as simple as creating a subdirectory -

在这里插入图片描述

A nested package can be imported similar to a root package. Just provide its path relative to the module’s path github.com/callicoder/packer -

在这里插入图片描述

添加第三方包

Adding 3rd party packages to your project is very easy with Go modules. You can just import the package to any of the source files in your project, and the next time you build/run the project, Go automatically downloads it for you (此处存疑,因为我这里没有自动下载)

手动安装

You can use go get command to download 3rd party packages from remote repositories.

$ go get -u github.com/jinzhu/gorm
The above command fetches the gorm package from Github and adds it as a dependency to your go.mod file.

That’s it. You can now import and use the above package in your program like this -

import "github.com/jinzhu/gorm"

Conclusion

That’s all folks! In this article, you learned how to organize Go code into reusable packages, how to import a package, how to export members of a package, how to create custom packages, and how to install third party packages.

Go语言学习笔记——通过示例代码和详尽的解释来帮助初学者理解Golang的核心概念
程序员光剑
08-01 2057
Go 是一种静态类型的、编译型、并发执行的编程语言,由 Google 创建于 2009 年。Go 拥有编译时类型检查、自动内存管理、安全高效运行等特性,能够在一些领域解决一些难题,如实时系统开发、云计算服务构建、分布式系统开发等。Go 是开源的,免费提供给所有人使用。前言里简单介绍了 Golang 以及为什么要学习它。接下来从环境安装到语法基础再到简单的编程实例,带领大家全面掌握 Golang。最后,对 Golang 提供的支持、参考资源做一些回顾。
golang package
09-17
众所周知的原因,golang的很多package国内无法下载,导致无法编译。这里给个资源,下载后放到GoPath下
golang:包(package)
OceanStar的博客
03-24 1940
golang源码复用建立在包(package)基础之上。golang的入口main()函数所在的包(package)叫做main,main包想要引用别的代码,必须同样以包的方式进行引用 golang与文件夹一一对应,所有与包相关的操作,必须依赖于工作目录(GOPATH)。 包的基本导入 golang语言是使用包来组织源代码的,包是多个golang源码的集合,是一种高级的代码复用方案。golang为我们提供了很多内置的包,如 fmt、os、io 等。 任何源代码文件必须属于某个包,同时源码文件的第一行有效.
GoLangpackage
weixin_52690231的博客
05-16 384
GoLangpackage
golang package教程
最新发布
HierarchCharles的博客
04-08 473
Go语言中支持模块化的开发理念,在Go语言中使用包(package)来支持代码模块化和代码复用。一个包是由一个或多个Go源码文件(.go结尾的文件)组成,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmtosio等。例如,在之前的章节中我们频繁使用了fmt这个内置包。") }上面短短的几行代码就涉及到了如何定义包以及如何引入其它包两个内容,接下来我们依次介绍一下它们。我们可以根据自己的需要创建自定义包。一个包可以简单理解为一个存放.go文件的文件夹。该文件夹下面的所有.go。
[Golang]Go Packages
dilunzhuang0924的博客
10-09 151
----------------------------------------------------------------------------------------------------------- 程序包标准类库其他程序包 子库 社区标准类库 名称 摘要 存档 ...
hello-golang-package
03-01
通过分析这个 "hello-golang-package",我们可以学习 Go 语言的基本语法、包管理和并发编程,这对于初学者来说是非常有价值的实践案例。同时,了解项目的结构和组织方式也有助于提高代码的可读性和可维护性。
Golang最新稳定windows版本go1.20.1.windows-amd64.zip
02-28
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并...无论你是初学者还是经验丰富的开发者,都可以通过这个版本快速地开始你的Go语言之旅。记得保持关注官方更新,以便获取最新的特性改进和安全修复。
Golang学习笔记(一):简介
09-22
### Golang学习笔记(一):简介 #### Go语言最主要的特性 ...无论是初学者还是有一定经验的开发者,都能够从中获得有价值的指导。随着对Go语言的深入学习和实践,将会发现更多有趣的功能和应用场景。
golang 语言程序设计
01-12
《Go语言程序设计》这本书是为想要学习和深入理解Go语言初学者准备的一份宝贵资源。Go语言,也称为Golang,是由Google公司开发的一种静态类型、编译型、并发型、垃圾回收的现代编程语言,其设计目标是提高开发效率...
golang 扩展package 列表
01-08
Golang 扩展package golang 扩展package 列表 https://github.com/golang/arch.git https://github.com/golang/playground.git https://github.com/golang/debug.git https://github.com/golang/term.git https://github.com/golang/time.git https://github.com/golang/scratch.git https://github.com/golang/talks.git https:/
golang-box:准备Golang开发环境的Packer模板
07-07
Golang 盒子 准备Golang开发环境的Packer模板 描述 您可以通过以下过程轻松设置 Golang 开发环境。 创建流浪文件: # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| config.vm.define :node do |node| node.vm.box = "tkak/centos-7.0-x86_64-golang" end end 启动虚拟机和 SSH 登录: $ vagrant up $ vagrant ssh 启动 Golang 开发: i.g.) $ zsh ## If you want to use zsh 环境 盒子 操作系统 工具 centos-7.0-x86_64-golang CentOS 7.0 x86_64
[golang note] 包和导入
weixin_30376453的博客
01-27 96
package的作用 √packagegolang最基本的分发单位和工程管理中依赖关系的体现。 √每个golang源代码文件开头都拥有一个package声明,表示该golang代码所属的package。 √要生成golang可执行程序,必须建立一个名为main的package,并且在该package中必须包含一个名为main()的函数。 ...
golang package os
Geek猫的专栏
01-03 304
import “os” func Getenv(key string) string Getenv检索并返回名为key的环境变量的值。如果不存在该环境变量会返回空字符串。 root@vm:~# echo $HOME /root package main import ( &amp;amp;quot;fmt&amp;amp;quot; &amp;amp;quot;os&amp;amp;quot; &amp;amp;quot;os/user&amp;am
golang Package
Acton
07-16 1111
自定义package,首先需要设定GOPATH,这是自定义package的src文件以及生成.a文件的存放地;假设GOPATH的值为~/mypackage,则需要在mypackage目录下,创建src,bin,pkg目录,其中src目录下存放源码。pkg目录下会存放由go install生成的.a文件; 此处有个一注意点。每个pkg必须是文件夹+其对应的go文件组成。假设要生成math的Av
Golang package
95年的巨蟹
11-11 155
package calc import "fmt" var TT = 99 //包中的 变量名、函数名、接口、结构体 首字母小写,表示私有,仅能在本包内访问; func Add(x, y int) int { return x + y } func init() { fmt.Println("import 这个包时,自动执行") fmt.Println(TT)//99 全局变量先声明,在执行 init函数 } package importdemo2 import ( "fmt" bie
Golangpackage
Gcaptain
11-02 402
文章目录1.包的概述2.包的作用3. 包的导入 import4. 访问权限5. 初始化函数 init()6. Go程序执行顺序 1.包的概述 任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性。这种模块化的特性允许每个包可以被其它的不同项目共享和重用,在项目范围内、甚至全球范围统...
golang的包(package)
云上听风的博客
05-04 215
理解Golang包导入 http://tonybai.com/2015/03/09/understanding-import-packages/ import的是目录名 包名虽然可以跟目录名不同,但最好一样, 免得自己搞晕. 一个目录下只能有一个package, 目录下的所有文件都是同一个package 避免不同package循环引用
Golang包(package)管理
一只在校程序猿的技术贴
11-23 616
Golang除提供内置函数外,还提供了各种标准库,这些标准库都是用package来组织的。 $GOROOT与$GOPATH 在讲package管理之前,需要明确两个环境变量,$GOROOT和$GOPATH。 $GOROOT $GOROOT目录是存放Go内置工具的,包括各种标准库,比如常用的fmt包、strings包、strconv包等都在这个目录的子目录下。只有指定了$GOROOT,才能顺手的使用标准库。如果没有指定$GOROOT还import了"fmt",编译时可能就会报错,因为编译器不知道fmt
Golang编程入门与教程
教程旨在帮助初学者快速掌握这门语言,理解其设计哲学和核心特性。" 在深入探讨Golang之前,我们需要了解它的基本特点。Golang,又称为Go语言,是由Google在2012年推出的一种静态类型的编译语言。它的设计目标是...
写文章

热门文章

  • selenium基础入门 30870
  • 前端使用js发起http请求的几种方法 30096
  • init,service和systemctl的区别 25429
  • mysql查看数据库状态 14976
  • imp库,python进入import内部 13836

分类专栏

  • chrome 16篇
  • ai 1篇
  • flask 2篇
  • playwright 1篇
  • django 2篇
  • aigc 1篇
  • dw 18篇
  • java 16篇
  • golang 21篇
  • 笔记 1篇
  • ruby 1篇
  • php 2篇
  • sqlmap 9篇
  • security 41篇
  • python 64篇
  • db 43篇
  • network 12篇
  • frontend 71篇
  • 有趣 26篇
  • 软件测试 32篇
  • 工具 31篇
  • linux 47篇
  • ios 11篇
  • windows 15篇
  • 杂记 41篇

最新评论

  • 常用网站URL规划分析

    2401_85146469: https://api.bilibili.com/x/v1/dm/list.so?oid=122426590

  • 常用网站URL规划分析

    2401_85146469: {"code":-404,"message":"啥都木有","ttl":1}

  • [django] django好玩的地方在于,可以批量操作数据库了

    CSDN-Ada助手: 推荐 MySQL入门 技能树:https://edu.csdn.net/skill/mysql?utm_source=AI_act_mysql

  • 一篇文章记录我的三个月的数仓测试经验(draft)

    叶常落: 点个关注催更一下

  • 一篇文章记录我的三个月的数仓测试经验(draft)

    国家繁荣: 也没等到个后续

大家在看

  • 如何恢复已删除/未保存的 Powerpoint 文件 885
  • 2023南海区信息学竞赛 GOC甲组 221
  • 自动化画图(方形螺旋线)
  • JAVA基础:HashMap底层数组容量控制,TreeMap底层存取机制,位运算符,原码反码补码
  • 单片机实战项目|基于stm32单片机的智能衣柜设计

最新文章

  • nginx的vhost
  • 【nodejs环境】nvm是真有用
  • 【chrome插件】获取浏览器cookie
2024年12篇
2023年35篇
2022年113篇
2021年86篇
2020年45篇
2019年80篇
2018年35篇
2017年40篇
2016年79篇
2015年16篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家天水仿真人物玻璃钢雕塑多少钱丰县玻璃钢雕塑公司选哪家四川省玻璃钢雕塑哪里有做玻璃钢雕塑哪家值得信赖家装美陈玻璃钢雕塑山东欧式玻璃钢雕塑多少钱河南玻璃钢浮雕城市雕塑设计玻璃钢动物雕塑制造公司安宁设计玻璃钢雕塑哪里有湘潭大象玻璃钢雕塑湖南特色玻璃钢雕塑生产厂家楚雄市玻璃钢雕塑设计哪里有卖宁德抽象玻璃钢雕塑济源专业玻璃钢仿铜雕塑厂家中卫商场美陈普陀区知名玻璃钢雕塑信息推荐阜阳景观玻璃钢雕塑北京杯子型玻璃钢花盆玻璃钢雕塑 定做湖南玻璃钢酿酒文化雕塑玻璃钢绿植雕塑价格长垣玻璃钢雕塑设计玻璃钢校园运动雕塑价格甘南仿真人物玻璃钢雕塑价格博白玻璃钢雕塑价格南通玻璃钢海豚雕塑定制玻璃钢雕塑 哪里玻璃钢樱桃雕塑淮南园林景观玻璃钢雕塑徐州玻璃钢马雕塑设计香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化