02 2022 档案

摘要:时间和内存消耗 可以用这个便捷脚本 xtime 来测量: #!/bin/sh /usr/bin/time -f '%Uu %Ss %er %MkB %C' "$@" 在 Unix 命令行中像这样使用 xtime goprogexec,这里的 progexec 是一个 Go 可执行程序,这句命令行输出 阅读全文
posted @ 2022-02-05 19:37 Galaxies2580 阅读(54) 评论(0) 推荐(0) 编辑
摘要:每当函数返回时,我们应该检查是否有错误发生:但是这会导致重复乏味的代码。结合 defer/panic/recover 机制和闭包可以得到一个我们马上要讨论的更加优雅的模式。不过这个模式只有当所有的函数都是同一种签名时可用,这样就有相当大的限制。一个很好的使用它的例子是 web 应用,所有的处理函数都 阅读全文
posted @ 2022-02-05 19:37 Galaxies2580 阅读(12) 评论(0) 推荐(0) 编辑
摘要:当发生像数组下标越界或类型断言失败这样的运行错误时,Go 运行时会触发运行时 panic ,伴随着程序的崩溃抛出一个 runtime.Error 接口类型的值。这个错误值有个 RuntimeError() 方法用于区别普通错误。 panic 可以直接从代码初始化:当错误条件(我们所测试的代码)很严苛 阅读全文
posted @ 2022-02-05 19:36 Galaxies2580 阅读(31) 评论(0) 推荐(0) 编辑
摘要:这是所有自定义包实现者应该遵守的最佳实践: 1) 在包内部,总是应该从 panic 中 recover :不允许显式的超出包范围的 panic () 2)向包的调用者返回错误值(而不是 panic)。 在包内部,特别是在非导出函数中有很深层次的嵌套调用时,对主调函数来说用 panic 来表示应该被翻 阅读全文
posted @ 2022-02-05 19:36 Galaxies2580 阅读(15) 评论(0) 推荐(0) 编辑
摘要:编写测试代码时,一个较好的办法是把测试的输入数据和期望的结果写在一起组成一个数据表:表中的每条记录都是一个含有输入和期望值的完整测试用例,有时还可以结合像测试名字这样的额外信息来让测试输出更多的信息。 实际测试时简单迭代表中的每条记录,并执行必要的测试。 可以抽象为下面的代码段: var tests 阅读全文
posted @ 2022-02-05 19:35 Galaxies2580 阅读(20) 评论(0) 推荐(0) 编辑
摘要:正如名字一样,这个(recover)内建函数被用于从 panic 或 错误场景中恢复:让程序可以从 panicking 重新获得控制权,停止终止过程进而恢复正常执行。 recover 只能在 defer 修饰的函数中使用:用于取得 panic 调用中传递过来的错误值,如果是正常执行,调用 recov 阅读全文
posted @ 2022-02-05 19:34 Galaxies2580 阅读(189) 评论(0) 推荐(0) 编辑
摘要:Go 有一个预先定义的 error 接口类型 type error interface { Error() string } 错误值用来表示异常状态。errors 包中有一个 errorString 结构体实现了 error 接口。当程序处于错误状态时可以用 os.Exit(1) 来中止运行。 定义 阅读全文
posted @ 2022-02-05 19:34 Galaxies2580 阅读(46) 评论(0) 推荐(0) 编辑
摘要:os 包有一个 StartProcess 函数可以调用或启动外部系统命令和二进制可执行文件;它的第一个参数是要运行的进程,第二个参数用来传递选项或参数,第三个参数是含有系统环境基本信息的结构体。 这个函数返回被启动进程的 id(pid),或者启动失败返回错误。 exec 包中也有同样功能的更简单的结 阅读全文
posted @ 2022-02-05 19:34 Galaxies2580 阅读(49) 评论(0) 推荐(0) 编辑
摘要:首先所有的包都应该有一定的必要文档,然后同样重要的是对包的测试。 名为 testing 的包被专门用来进行自动化测试,日志和错误报告。并且还包含一些基准测试函数的功能。 备注:gotest 是 Unix bash 脚本,所以在 Windows 下你需要配置 MINGW 环境;在 Windows 环境 阅读全文
posted @ 2022-02-05 19:33 Galaxies2580 阅读(134) 评论(0) 推荐(0) 编辑
摘要:et08 package main import ( "fmt" "even/even" ) func main() { for i:=0; i<=100; i++ { fmt.Printf("Is the integer %d even? %v\n", i, even.Even(i)) } } e 阅读全文
posted @ 2022-02-05 19:33 Galaxies2580 阅读(52) 评论(0) 推荐(0) 编辑
摘要:godoc 工具在显示自定义包中的注释也有很好的效果:注释必须以 // 开始并无空行放在声明(包,类型,函数)前。godoc 会为每个文件生成一系列的网页。 例如: 在 doc_examples 目录下我们有第 11.7 节中的用来排序的 go 文件,文件中有一些注释(文件需要未编译) 命令行下进入 阅读全文
posted @ 2022-02-04 14:19 Galaxies2580 阅读(27) 评论(0) 推荐(0) 编辑
摘要:当开始一个新项目或增加新的功能到现有的项目,你可以通过在应用程序中使用已经存在的库来节省开发时间。为了做到这一点,你必须理解库的 API(应用编程接口),那就是:库中有哪些方法可以调用,如何调用。你可能没有这个库的源代码,但作者肯定有记载的 API 以及详细介绍了如何使用它。 作为一个例子,我们将使 阅读全文
posted @ 2022-02-04 14:18 Galaxies2580 阅读(93) 评论(0) 推荐(0) 编辑
摘要:为了示范,我们创建了一个名为 uc 的简单包,它含有一个 UpperCase 函数将字符串的所有字母转换为大写。当然这并不值得创建一个自己包,同样的功能已被包含在 strings 包里,但是同样的技术也可以应用在更复杂的包中。 自定义包的目录结构 下面的结构给了你一个好的示范: /home/user 阅读全文
posted @ 2022-02-04 14:18 Galaxies2580 阅读(59) 评论(0) 推荐(0) 编辑
摘要:安装到 GitHub 以上的方式对于本地包来说是可以的,但是我们如何打包代码到开发者圈子呢?那么我们需要一个云端的源码的版本控制系统,比如著名的 Git。 在 Linux 和 OS X 的机器上 Git 是默认安装的,在 Windows 上你必须先自行安装,参见 GitHub 帮助页面。 这里将通过 阅读全文
posted @ 2022-02-04 14:17 Galaxies2580 阅读(197) 评论(0) 推荐(0) 编辑
摘要:go install 是 Go 中自动包安装工具:如需要将包安装到本地它会从远端仓库下载包:检出、编译和安装一气呵成。 在包安装前的先决条件是要自动处理包自身依赖关系的安装。被依赖的包也会安装到子目录下,但是没有文档和示例:可以到网上浏览。 go install 使用了 GOPATH 变量 。 远端 阅读全文
posted @ 2022-02-04 14:16 Galaxies2580 阅读(249) 评论(0) 推荐(0) 编辑
摘要:在一些复杂的程序中,通常通过不同线程执行不同应用来实现程序的并发。当不同线程要使用同一个变量时,经常会出现一个问题:无法预知变量被不同线程修改的顺序!(这通常被称为资源竞争,指不同线程对同一变量使用的竞争) 显然这无法让人容忍,那我们该如何解决这个问题呢? 经典的做法是一次只能让一个线程对共享变量进 阅读全文
posted @ 2022-02-04 14:16 Galaxies2580 阅读(10) 评论(0) 推荐(0) 编辑
摘要:像 fmt、os 等这样具有常用功能的内置包在 Go 语言中有 150 个以上,它们被称为标准库,大部分 (一些底层的除外) 内置于 Go 本身。完整列表可以在 Go Walker 查看。 在贯穿本书的例子和练习中,我们都是用标准库的包。可以通过查阅第 350 页包中的内容快速找到相关的包的实例。这 阅读全文
posted @ 2022-02-04 14:15 Galaxies2580 阅读(182) 评论(0) 推荐(0) 编辑
摘要:我们知道有些时候通过编程的方式去进行计算是不精确的。如果你使用 Go 语言中的 float64 类型进行浮点运算,返回结果将精确到 15 位,足以满足大多数的任务。当对超出 int64 或者 uint64 类型这样的大数进行计算时,如果对精度没有要求,float32 或者 float64 可以胜任, 阅读全文
posted @ 2022-02-04 14:15 Galaxies2580 阅读(32) 评论(0) 推荐(0) 编辑
摘要:现在我们知道如何使用 Go 以及它的标准库了,但是 Go 的生态要比这大的多。当着手自己的 Go 项目时,最好先查找下是否有些存在的第三方的包或者项目能不能使用。大多数可以通过 go install 来进行安装。 Go Walker 支持根据包名在海量数据中查询。 目前已经有许多非常好的外部库,如: 阅读全文
posted @ 2022-02-04 14:14 Galaxies2580 阅读(35) 评论(0) 推荐(0) 编辑
摘要:在下面的程序里,我们将在字符串中对正则表达式进行匹配。 如果是简单模式,使用 Match 方法便可: ok, _ := regexp.Match(pat, []byte(searchIn)) 变量 ok 将返回 true 或者 false, 我们也可以使用 MatchString: ok, _ := 阅读全文
posted @ 2022-02-04 14:14 Galaxies2580 阅读(32) 评论(0) 推荐(0) 编辑
摘要:可以使用 for 循环构造 map: for key, value := range map1 { ... } 第一个返回值 key 是 map 中的 key 值,第二个返回值则是该 key 对应的 value 值;这两个都是仅 for 循环内部可见的局部变量。其中第一个返回值 key 值是一个可选 阅读全文
posted @ 2022-02-04 14:13 Galaxies2580 阅读(37) 评论(0) 推荐(0) 编辑
摘要:map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序。 如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序,然后可以使用切片的 for-range 方法打印出所有的 key 和 value。 map06 // the telephone 阅读全文
posted @ 2022-02-04 14:10 Galaxies2580 阅读(1954) 评论(0) 推荐(0) 编辑
摘要:假设我们想获取一个 map 类型的切片,我们必须使用两次 make() 函数,第一次分配切片,第二次分配切片中每个 map 元素。 map05 package main import "fmt" func main() { // Version A: items := make([]map[int] 阅读全文
posted @ 2022-02-04 14:10 Galaxies2580 阅读(101) 评论(0) 推荐(0) 编辑
摘要:测试 map1 中是否存在 key1: 我们已经见过可以使用 val1 = map1[key1] 的方法获取 key1 对应的值 val1。如果 map 中不存在 key1,val1 就是一个值类型的空值。 这就会给我们带来困惑了:现在我们没法区分到底是 key1 不存在还是它对应的 value 就 阅读全文
posted @ 2022-02-04 14:10 Galaxies2580 阅读(59) 评论(0) 推荐(0) 编辑
摘要:这里对调是指调换 key 和 value。如果 map 的值类型可以作为 key 且所有的 value 是唯一的,那么通过下面的方法可以简单的做到键值对调。 map07 package main import ( "fmt" ) var ( barVal = map[string]int{"alph 阅读全文
posted @ 2022-02-04 14:05 Galaxies2580 阅读(477) 评论(0) 推荐(0) 编辑
摘要:概念 map 是引用类型,可以使用如下声明: var map1 map[keytype]valuetype var map1 map[string]int ([keytype] 和 valuetype 之间允许有空格,但是 gofmt 移除了空格) 在声明的时候不需要知道 map 的长度,map 是 阅读全文
posted @ 2022-02-04 14:03 Galaxies2580 阅读(27) 评论(0) 推荐(0) 编辑
摘要:Map map 是一种特殊的数据结构:一种元素对(pair)的无序集合,pair 的一个元素是 key,对应的另一个元素是 value,所以这个结构也称为关联数组或字典。这是一种快速寻找值的理想结构:给定 key,对应的 value 可以迅速定位。 map 这种数据结构在其他编程语言中也称为字典(P 阅读全文
posted @ 2022-02-04 13:30 Galaxies2580 阅读(29) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示