diff --git a/eBook/11.10.md b/eBook/11.10.md index b98c178..bde1cab 100644 --- a/eBook/11.10.md +++ b/eBook/11.10.md @@ -54,7 +54,7 @@ const ( ) ``` -对于变量 x,如果 `v:=reflect.ValueOf(x)`,那么 `v.Kind()` 返回 float64 ,所以下面的表达式是 `true` +对于 float64 类型的变量 x,如果 `v:=reflect.ValueOf(x)`,那么 `v.Kind()` 返回 `reflect.Float64` ,所以下面的表达式是 `true` `v.Kind() == reflect.Float64` Kind 总是返回底层类型: diff --git a/eBook/11.12.md b/eBook/11.12.md index c4672e4..5d70160 100644 --- a/eBook/11.12.md +++ b/eBook/11.12.md @@ -2,7 +2,7 @@ ## 11.12.1 Go 的动态类型 -在经典的面向对象语言(像 C++,Java 和 C#)中数据和方法被封装为 `类的概念`:类包含它们两者,并且不能剥离。 +在经典的面向对象语言(像 C++,Java 和 C#)中数据和方法被封装为 `类` 的概念:类包含它们两者,并且不能剥离。 Go 没有类:数据(结构体或更一般的类型)和方法是一种松耦合的正交关系。 @@ -10,7 +10,7 @@ Go 中的接口跟 Java/C# 类似:都是必须提供一个指定方法集的 和其它语言相比,Go 是唯一结合了接口值,静态类型检查(是否该类型实现了某个接口),运行时动态转换的语言,并且不需要显式地声明类型是否满足某个接口。该特性允许我们在不改变已有的代码的情况下定义和使用新接口。 -接收一个(或多个)接口类型作为参数的函数,可以被实现了该接口的类型实例调用。`实现了某个接口的类型可以被传给任何以此接口为参数的函数`。 +接收一个(或多个)接口类型作为参数的函数,其实参可以是任何实现了该接口的类型。 `实现了某个接口的类型可以被传给任何以此接口为参数的函数` 。 类似于 Python 和 Ruby 这类动态语言中的 `动态类型(duck typing)`;这意味着对象可以根据提供的方法被处理(例如,作为参数传递给函数),而忽略它们的实际类型:它们能做什么比它们是什么更重要。 diff --git a/eBook/11.14.md b/eBook/11.14.md index 83805c6..67638b0 100644 --- a/eBook/11.14.md +++ b/eBook/11.14.md @@ -98,7 +98,7 @@ allUnsortedCars.Process(sortedAppender) BMWCount := len(sortedCars[“BMW”]) ``` -我们让这些代码在下面的程序 cars.go(此处只展示了 main() 中的代码,别的代码已经在上面展示)中执行: +我们让这些代码在下面的程序 cars.go 中执行: 示例 11.18 [cars.go](examples/chapter_11/cars.go): diff --git a/eBook/12.12.md b/eBook/12.12.md index 662f9e2..ef16a3b 100644 --- a/eBook/12.12.md +++ b/eBook/12.12.md @@ -73,7 +73,7 @@ type Hash interface { } ``` -通过 io.WriteString 或 hasher.Write 计算给定字符串的校验值。 +通过 io.WriteString 或 hasher.Write 将给定的 []byte 附加到当前的 `hash.Hash` 对象中。 **练习 12.9**:[hash_md5.go](exercises/chapter_12/hash_md5.go): diff --git a/eBook/12.8.md b/eBook/12.8.md index 06fd0b2..b0bfe14 100644 --- a/eBook/12.8.md +++ b/eBook/12.8.md @@ -67,7 +67,7 @@ func NewWriter(wr io.Writer) (b *Writer) **练习 12.7**:[remove_3till5char.go](exercises/chapter_12/remove_3till5char.go) -下面的代码有一个输入文件 `goprogram.go`,然后以每一行为单位读取,从读取的当前行中截取第 3 到第 5 的字节写入另一个文件。然而当你运行这个程序,输出的文件却是个空文件。找出程序逻辑中的 bug,修正它并测试。 +下面的代码有一个输入文件 `goprogram`,然后以每一行为单位读取,从读取的当前行中截取第 3 到第 5 的字节写入另一个文件。然而当你运行这个程序,输出的文件却是个空文件。找出程序逻辑中的 bug,修正它并测试。 ```go package main @@ -76,11 +76,12 @@ import ( "bufio" "fmt" "os" + "io" ) func main() { - inputFile, _ := os.Open("goprogram.go") - outputFile, _ := os.OpenFile("goprogramT.go", os.O_WRONLY|os.O_CREATE, 0666) + inputFile, _ := os.Open("goprogram") + outputFile, _ := os.OpenFile("goprogramT", os.O_WRONLY|os.O_CREATE, 0666) defer inputFile.Close() defer outputFile.Close() inputReader := bufio.NewReader(inputFile) @@ -91,7 +92,7 @@ func main() { fmt.Println("EOF") return } - outputString := string([]byte(inputString)[2:5]) + "\r\n" + outputString := string(inputString[2:5]) + "\r\n" n, err := outputWriter.WriteString(outputString) if err != nil { fmt.Println(err) diff --git a/eBook/12.9.md b/eBook/12.9.md index 620e091..2dfdf86 100644 --- a/eBook/12.9.md +++ b/eBook/12.9.md @@ -28,16 +28,16 @@ } ``` -尽管 XML 被广泛的应用,但是 JSON 更加简洁、轻量(占用更少的内存、磁盘及网络带宽)和更好的可读性,这也说明它越来越受欢迎。 +尽管 XML 被广泛的应用,但是 JSON 更加简洁、轻量(占用更少的内存、磁盘及网络带宽)和更好的可读性,这也使它越来越受欢迎。 Go 语言的 json 包可以让你在程序中方便的读取和写入 JSON 数据。 -我们将在下面的例子里使用 json 包,并使用练习 10.1 vcard.go 中一个简化版本的 Address 和 VCard 结构(为了简单起见,我们忽略了很多错误处理,不过在实际应用中你必须要合理的处理这些错误,参阅 13 章) +我们将在下面的例子里使用 json 包,并使用练习 10.1 [vcard.go](exercises/chapter_10/vcard.go) 中一个简化版本的 Address 和 VCard 结构(为了简单起见,我们忽略了很多错误处理,不过在实际应用中你必须要合理的处理这些错误,参阅 13 章) 示例 12.16 [json.go](examples/chapter_12/json.go): ```go -// json.go.go +// json.go package main import ( @@ -79,7 +79,7 @@ func main() { } ``` -`json.Marshal()` 的函数签名是 `func Marshal(v interface{}) ([]byte, error)`,下面是数据编码后的 JSON 文本(实际上是一个 []bytes): +`json.Marshal()` 的函数签名是 `func Marshal(v interface{}) ([]byte, error)`,下面是数据编码后的 JSON 文本(实际上是一个 []byte): ```javascript { @@ -100,6 +100,8 @@ func main() { 出于安全考虑,在 web 应用中最好使用 `json.MarshalforHTML()` 函数,其对数据执行HTML转码,所以文本可以被安全地嵌在 HTML `