阿里云添加网站,中国机械加工网站,淘宝网站建设教程视频教程,wordpress ftp上传文章目录 标准库概述regexp包锁和sync包自定义包和可见性基本格式导入外部安装包包的初始化 自定义包使用godoc自定义包的目录结构 标准库概述
在之前的部分已经用了很多和标准库有关的内容#xff0c;比如有fmt#xff0c;os这种功能
unsafe: 包含了一些打破 Go 语言“类型… 文章目录 标准库概述regexp包锁和sync包自定义包和可见性基本格式导入外部安装包包的初始化 自定义包使用godoc自定义包的目录结构 标准库概述
在之前的部分已经用了很多和标准库有关的内容比如有fmtos这种功能
unsafe: 包含了一些打破 Go 语言“类型安全”的命令一般的程序中不会被使用可用在 C/C 程序的调用中syscall-os-os/exec: os: 提供给我们一个平台无关性的操作系统功能接口采用类 Unix 设计隐藏了不同操作系统间的差异让不同的文件系统和操作系统对象表现一致os/exec: 提供我们运行外部操作系统命令和程序的方式syscall: 底层的外部包提供了操作系统底层调用的基本接口
regexp包
正则表达式常用于字符串中进行一些配置的匹配例如
func test1() {//目标字符串searchIn : John: 2578.34 William: 4567.23 Steve: 5632.18pat : [0-9].[0-9] //正则f : func(s string) string {v, _ : strconv.ParseFloat(s, 32)return strconv.FormatFloat(v*2, f, 2, 32)}if ok, _ : regexp.Match(pat, []byte(searchIn)); ok {fmt.Println(Match Found!)}re, _ : regexp.Compile(pat)//将匹配到的部分替换为##.#str : re.ReplaceAllString(searchIn, ##.#)fmt.Println(str)//参数为函数时str2 : re.ReplaceAllStringFunc(searchIn, f)fmt.Println(str2)
}锁和sync包
在一些复杂的程序中通常通过不同线程执行不同应用来实现程序的并发。当不同线程要使用同一个变量时经常会出现一个问题无法预知变量被不同线程修改的顺序这通常被称为资源竞争指不同线程对同一变量使用的竞争显然这无法让人容忍那我们该如何解决这个问题呢
经典的做法是一次只能让一个线程对共享变量进行操作。当变量被一个线程改变时临界区我们为它上锁直到这个线程执行完成并解锁后其他线程才能访问它
在之前的map中由于性能的原因它实际上并不是现成安全的所以在并行访问一个共享的map资源的时候实际上是会出现错误
而在Go语言中这种锁的机制是通过sync包中的锁来完成的这意味着线程将会以有序的对同一个变量进行访问
sync.Mutex 是一个互斥锁它的作用是守护在临界区入口来确保同一时间只能有一个线程进入临界区
因此可以有下面的例子假设有一个共享资源需要被保护那么就可以借助锁来进行对应的保护
// 定义需要保护起来的成员
type test2Info struct {mu sync.Mutexstr string
}func test2Update(i *test2Info) {i.mu.Lock()i.str hello goi.mu.Unlock()
}func test2() {// 现在要对这个str进行修改那么就需要先加锁再解锁var i test2Infotest2Update(i)
}相对简单的情况下通过使用 sync 包可以解决同一时间只能一个线程访问变量或 map 类型数据的问题。如果这种方式导致程序明显变慢或者引起其他问题我们要重新思考来通过 goroutines 和 channels 来解决问题这是在 Go 语言中所提倡用来实现并发的技术
自定义包和可见性
基本格式
import 的一般格式如下:
import 包的路径或 URL 地址导入外部安装包
如果你要在你的应用中使用一个或多个外部包首先你必须使用go install在你的本地机器上安装它们
假设你想使用 http://codesite.ext/author/goExample/goex 这种托管在 Google Code、GitHub 和 Launchpad 等代码网站上的包
通过如下命令安装
go install codesite.ext/author/goExample/goex将一个名为 codesite.ext/author/goExample/goex 的 map 安装在 $GOROOT/src/ 目录下
通过以下方式一次性安装并导入到你的代码中
import goex codesite.ext/author/goExample/goex因此该包的 URL 将用作导入路径
包的初始化
程序的执行开始于导入包初始化 main 包然后调用 main() 函数
一个没有导入的包将通过分配初始值给所有的包级变量和调用源码中定义的包级 init() 函数来初始化。一个包可能有多个 init() 函数甚至在一个源码文件中。它们的执行是无序的。这是最好的例子来测定包的值是否只依赖于相同包下的其他值或者函数
init() 函数是不能被调用的
导入的包在包自身初始化前被初始化而一个包在程序执行中只能初始化一次
自定义包使用godoc
godoc在显示自定义包中的注释也有很好的效果注释必须以 // 开始并无空行放在声明包类型函数前。godoc 会为每个文件生成一系列的网页
自定义包的目录结构
/home/user/goprogramsucmain.go (uc 包主程序)Makefile (ucmain 的 makefile)ucmainsrc/uc (包含 uc 包的 go 源码)uc.gouc_test.goMakefile (包的 makefile)uc.a_objuc.a_testuc.abin (包含最终的执行文件)ucmainpkg/linux_amd64uc.a (包的目标文件)