Go语言与数据库开发:01-09

包和工具

Go语言有超过100个的标准包(译注:可以用 go list std | wc -l 命令查看标准包的具体数
目),标准库为大多数的程序提供了必要的基础构件。在Go的社区,有很多成熟的包被设
计、共享、重用和改进,目前互联网上已经发布了非常多的Go语音开源包,它们可以通过
http://godoc.org 检索。

Go还自带了工具箱,里面有很多用来简化工作区和包管理的小工具。

包简介

任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放
进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对
独立性。这种模块化的特性允许每个包可以被其它的不同项目共享和重用,在项目范围内、
甚至全球范围统一的分发和复用。

每个包一般都定义了一个不同的名字空间用于它内部的每个标识符的访问。每个名字空间关
联到一个特定的包,让我们给类型、函数等选择简短明了的名字,这样可以避免在我们使用
它们的时候减少和其它部分名字的冲突。

每个包还通过控制包内名字的可见性和是否导出来实现封装特性。通过限制包成员的可见性
并隐藏包API的具体实现,将允许包的维护者在不影响外部包用户的前提下调整包的内部实
现。通过限制包内变量的可见性,还可以强制用户通过某些特定函数来访问和更新内部变
量,这样可以保证内部变量的一致性和并发时的互斥约束。

当我们修改了一个源文件,我们必须重新编译该源文件对应的包和所有依赖该包的其他包。
即使是从头构建,Go语言编译器的编译速度也明显快于其它编译语言。Go语言的闪电般的编
译速度主要得益于三个语言特性。第一点,所有导入的包必须在每个文件的开头显式声明,
这样的话编译器就没有必要读取和分析整个源文件来判断包的依赖关系。第二点,禁止包的
环状依赖,因为没有循环依赖,包的依赖关系形成一个有向无环图,每个包可以被独立编
译,而且很可能是被并发编译。第三点,编译后包的目标文件不仅仅记录包本身的导出信
息,目标文件同时还记录了包的依赖关系。因此,在编译一个包的时候,编译器只需要读取
每个直接导入包的目标文件,而不需要遍历所有依赖的的文件

导入路径

每个包是由一个全局唯一的字符串所标识的导入路径定位。出现在import语句中的导入路径也
是字符串。
import (
"fmt"
"math/rand"
"encoding/json"
"golang.org/x/net/html"
"github.com/go-sql-driver/mysql"
)

Go语言的规范并没有指明包的导入路径字符串的具体含义,导
入路径的具体含义是由构建工具来解释的。

也有第三方扩展的工具箱存在。例如,Google
公司内部的Go语言码农,他们就使用内部的多语言构建系统。用不同的规则来处理包名字和定位包,
用不同的规则来处理单元测试等等,因为这样可以更紧密适配他们内部环境。

如果你计划分享或发布包,那么导入路径最好是全球唯一的。为了避免冲突,所有非标准库
包的导入路径建议以所在组织的互联网域名为前缀;而且这样也有利于包的检索。例如,上
面的import语句导入了Go团队维护的HTML解析器和一个流行的第三方维护的MySQL驱动。

包声明

在每个Go语音源文件的开头都必须有包声明语句。包声明语句的主要目的是确定当前包被其
它包导入时默认的标识符。

例如,math/rand包的每个源文件的开头都包含 package rand 包声明语句,所以当你导入这个
包,你就可以用rand.Int、rand.Float64类似的方式访问包的成员。
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Int())
}

通常来说,默认的包名就是包导入路径名的最后一段,因此即使两个包的导入路径不同,它
们依然可能有一个相同的包名。例如,math/rand包和crypto/rand包的包名都是rand。

关于默认包名一般采用导入路径名的最后一段的约定也有三种例外情况。第一个例外,包对
应一个可执行程序,也就是main包,这时候main包本身的导入路径是无关紧要的。

名字为main的包是给go build构建命令一个信息,这个包编译完之后必须调用连接器生
成一个可执行程序。

第二个例外,包所在的目录中可能有一些文件名是以test.go为后缀的Go源文件,并且这些源文件声明的包名也是以
_test为后缀名的。这种目录可以包含两种包:一种普通包,加一种则是测试的外部扩展包。
所有以_test为后缀包名的测试外部扩展包都由go test命令独立编译,普通包和测试的外部扩
展包是相互独立的。

第三个例外,一些依赖版本号的管理工具会在导入路径后追加版本号信息

导入声明

可以在一个Go语言源文件包声明语句之后,其它非导入声明语句之前,包含零到多个导入包
声明语句。每个导入声明可以单独指定一个导入路径,也可以通过圆括号同时导入多个导入
路径。

下面两个导入形式是等价的,但是第二种形式更为常见。
import "fmt"
import "os"
import (
"fmt"
"os"
)

导入的包之间可以通过添加空行来分组;通常将来自不同组织的包独自分组。包的导入顺序
无关紧要,但是在每个分组中一般会根据字符串顺序排列。

import (
"fmt"
"html/template"
"os"
"golang.org/x/net/html"
"golang.org/x/net/ipv4"
)

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

导入包的重命名只影响当前的源文件。其它的源文件如果导入了相同的包,可以用导入包原
本默认的名字或重命名为另一个完全不同的名字。
导入包重命名是一个有用的特性,它不仅仅只是为了解决名字冲突。如果导入的一个包名很
笨重,特别是在一些自动生成的代码中,这时候用一个简短名称会更方便。选择用简短名称
重命名导入包时候最好统一,以避免包名混乱。选择另一个包名称还可以帮助避免和本地普
通变量名产生冲突。例如,如果文件中已经有了一个名为path的变量,那么我们可以
将"path"标准包重命名为pathpkg。
每个导入声明语句都明确指定了当前包和被导入包之间的依赖关系。如果遇到包循环导入的
情况,Go语言的构建工具将报告错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279666.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 文本后图标_如何在Android中更改文本,图标等的大小

android 文本后图标Let’s face it: no matter how good the screens are on our phones and tablets, the text can sometimes be too tiny if you have poor eyesight. The good news is that there are a variety of methods to help you alleviate squinting just to make …

Code Chef February Challenge 2019题解

传送门 \(HMAPPY2\) 咕 话说这题居然卡\(scanf\)的么??? int T;cin>>T; while(T--){cin>>n>>a>>b>>k;puts(n/an/b-n/(a*b/__gcd(a,b))*2>k?"Win":"Lose"); } \(CHEFING\) 咕咕 int T;…

Linux文本查看命令之uniq

uniq是专用的去重命令限制:必须相邻的两行内容相同才算是重复,如果内容相同,但是两行之间有其他内容就不算重复。使用uniq命令先排序,再去重。-d 的选项是用来仅显示重复行的-u 仅显示不重复的行-c 统计每一行出现的次数本文转自 …

BitMap位图与海量数据的理解与应用

1. Bit Map算法简介 来自于《编程珠玑》。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。 2、 Bit Map的基本思想 我们先来看一个具体的例子&a…

imdb文件_如何停止IMDB应用程序向您发送通知

imdb文件Recently, the IMDB app started sending out notifications for “Featured Trailers”. As near as I can guess, this is where the production company pays IMDB to push a link to the trailer to a load of people in an effort to promote it. If IMDB isn’t …

科普:BCH能够买什么?如何使用BCH买东西?

2019独角兽企业重金招聘Python工程师标准>>> 一提到BCH,你最想拿它做什么?可能对于投资者来说,它是暴富的神器,是投资的工具;对于开发者来说,是实现自身价值构建应用程序的网络和平台&#xff0…

驱动学习之驱动体验

1:什么是linux驱动 从本质上讲,驱动就是属于内核层面的程序代码,是直接和硬件打交道的。与裸机中直接操作寄存器去操作硬件的不同之处在于,裸机中操作的是物理内存,而我们在驱动中操作的是虚拟内存,驱动中还…

vim(三)golang代码跳转配

在golang的代码里跳来跳去。。。。 godef 安装 跳转是通过godef实现,godef的安装目录一般是$GOBIN,只要让godef命令在$PATH下即可 godef 命令安装: go get -v github.com/rogpeppe/godef go install -v github.com/rogpeppe/godef vim插件安装 ~/.vimrc配…

如何将iPhone或iPad更新到iOS 11

Apple released iOS 11 on September 19, 2017. You can upgrade by tapping “Install Now” when an update message appears, but you can also check for the update and install it immediately. 苹果于2017年9月19日发布了iOS11 。您可以通过在出现更新消息时点按“立即安…

三、Python-列表

三、Python-列表 一、序列:是一块用于存放多个值的连续内存空间,并且按一定顺序排列,可以通过索引取值索引:从左到右的索引从0开始依次增加的正整数;从右到左的索引为-1开始的复数切片(分片)&am…

使用基本ACL规则限制用户登录

要求:配置ACL 2005规则,限制vty 0 4界面只允许IP地址为192.168.1.8的用户和10.10.100.0/24网段的用户登录设备。 配置如下: system-view acl 2005 rule permit source 192.168.1.8 0 //允许IP地址为192.168.1.8的用户登录设备 rule permit s…

pandas 入门(2)

from pandas import Series, DataFrame, Index import numpy as np from numpy import nan as NAobj Series(range(3), index[a, b, c]) print(obj) index obj.index print(index) print(index[1:]) # index[1] d index对象时不可以被修改的 为了安全和共享index Index(n…

如何在Outlook 2013中管理附件

There comes a time, job-hunting, or sharing photos with older family members, where you may need to send stuff the old fashioned way – as an email attachment. If you email at work, it may be a part of your email repertoire. 有时需要找工作,与年长…

了解cron以及使用cron定时备份MySQL

cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务: /sbin/service crond start //启动服务 /sbin/service crond stop //关…

ef 并发控制

ef 并发控制 ef 并发控制 什么是并发?并发分悲观并发和乐观并发。悲观并发:比如有两个用户A,B,同时登录系统修改一个文档,如果A先进入修改,则系统会把该文档锁住,B就没办法打开了,只有等A修改完…

C#实现写入文本文件内容功能

private void write_txt(string str1, string str2, string str3)02{03System.DateTime currentTime System.DateTime.Now;04string strYMD currentTime.ToString("d");05string FILE_NAME "MyFileSend" strYMD ".txt";//每天按照日期建立一…

如何在Windows上设置BitLocker加密

BitLocker is a tool built into Windows that lets you encrypt an entire hard drive for enhanced security. Here’s how to set it up. BitLocker是Windows内置的工具,可用于加密整个硬盘驱动器以增强安全性。 设置方法如下。 When TrueCrypt controversially …

Java字节码方法表与属性表深度剖析

方法表: 在上一次咱们已经分析到了字段信息了,如下: 紧接着就是方法相关的信息了: 而它展开之后的结构为: 所以往后数2个字节,看一下方法的总数: 3个方法,可咱们只定义了两个方法呀&…

最大连续子数组和与JUnit测试

【题目】最大连续子数组和(最大子段和) 背景 问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]a[i1]…a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义…

笔记本电源适配器为什么总坏_为什么某些交流适配器和电源会发出啸叫声?

笔记本电源适配器为什么总坏Most of the time our AC adapters and power supplies tend to be quiet, but what does it mean when one makes a whining noise? Should you be concerned? Today’s SuperUser Q&A post has the answers to a worried reader’s question…