Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

修改第一二章中的一些小问题 #87

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion chapter01/01.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ type Writer interface {

在上个例子中,我们是自己实现一个函数接收一个 io.Reader 类型的参数。这里,我们通过标准库的例子来学习。

在fmt标准库中,有一组函数:Fprint/Fprintf/Fprintln,它们接收一个 io.Wrtier 类型参数(第一个参数),也就是说它们将数据格式化输出到 io.Writer 中。那么,调用这组函数时,该如何传递这个参数呢?
在fmt标准库中,有一组函数:Fprint/Fprintf/Fprintln,它们接收一个 io.Writer 类型参数(第一个参数),也就是说它们将数据格式化输出到 io.Writer 中。那么,调用这组函数时,该如何传递这个参数呢?

我们以 fmt.Fprintln 为例,同时看一下 fmt.Println 函数的源码。

Expand Down
4 changes: 2 additions & 2 deletions chapter01/01.3.md
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ Sprint/Sprintf/Sprintln 是格式化内容为 string 类型,而并不输出到

在这三组函数中,`S/F/Printf`函数通过指定的格式输出或格式化内容;`S/F/Print`函数只是使用默认的格式输出或格式化内容;`S/F/Println`函数使用默认的格式输出或格式化内容,同时会在最后加上"换行符"。

Print 序列函数的最后一个参数都是 `a ...interface{}` 这种不定参数。对于`S/F/Printf`序列,这个不定参数的实参个数应该和`formt`参数的占位符个数一致,否则会出现格式化错误;而对于其他函数,当不定参数的实参个数为多个时,它们之间会直接(对于`S/F/Print`)或通过" "(空格)(对于`S/F/Println`)连接起来(注:对于`S/F/Print`,当两个参数都不是字符串时,会自动添加一个空格,否则不会加。感谢guoshanhe1983 反馈。[官方 effective_go](http://docs.studygolang.com/doc/effective_go.html#Printing) 也有说明)。利用这一点,我们可以做如下事情:
Print 序列函数的最后一个参数都是 `a ...interface{}` 这种不定参数。对于`S/F/Printf`序列,这个不定参数的实参个数应该和`format`参数的占位符个数一致,否则会出现格式化错误;而对于其他函数,当不定参数的实参个数为多个时,它们之间会直接(对于`S/F/Print`)或通过" "(空格)(对于`S/F/Println`)连接起来(注:对于`S/F/Print`,当两个参数都不是字符串时,会自动添加一个空格,否则不会加。感谢guoshanhe1983 反馈。[官方 effective_go](http://docs.studygolang.com/doc/effective_go.html#Printing) 也有说明)。利用这一点,我们可以做如下事情:

result1 := fmt.Sprintln("studygolang.com", 2013)
result2 := fmt.Sprint("studygolang.com", 2013)
Expand Down Expand Up @@ -637,4 +637,4 @@ func (p *pp) printArg(arg interface{}, verb rune) {

- [目录](/preface.md)
- 上一节:[ioutil — 方便的IO操作函数集](01.2.md)
- 下一节:[bufio — 缓存IO](01.4.md)
- 下一节:[bufio — 缓存IO](01.4.md)
8 changes: 4 additions & 4 deletions chapter01/01.4.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ ReadSlice 从输入中读取,直到遇到第一个界定符(delim)为止

注意,这里的界定符可以是任意的字符,可以将上面代码中的'\n'改为'm'试试。同时,返回的结果是包含界定符本身的,上例中,输出结果有一空行就是'\n'本身(line携带一个'\n',printf又追加了一个'\n')。

如果 ReadSlice 在找到界定符之前遇到了 error ,它就会返回缓存中所有的数据和错误本身(经常是 io.EOF)。如果在找到界定符之前缓存已经满了,ReadSlice 会返回 bufio.ErrBufferFull 错误。当且仅当返回的结果(line)没有以界定符结束的时候,ReadSlice 返回err != nil,也就是说,如果ReadSlice 返回的结果 line 不是以界定符 delim 结尾,那么返回的 er r也一定不等于 nil(可能是bufio.ErrBufferFull或io.EOF)。
如果 ReadSlice 在找到界定符之前遇到了 error ,它就会返回缓存中所有的数据和错误本身(经常是 io.EOF)。如果在找到界定符之前缓存已经满了,ReadSlice 会返回 bufio.ErrBufferFull 错误。当且仅当返回的结果(line)没有以界定符结束的时候,ReadSlice 返回err != nil,也就是说,如果ReadSlice 返回的结果 line 不是以界定符 delim 结尾,那么返回的 err 也一定不等于 nil(可能是bufio.ErrBufferFull或io.EOF)。
例子代码:
```go
reader := bufio.NewReaderSize(strings.NewReader("http://studygolang.com"),16)
Expand Down Expand Up @@ -448,14 +448,14 @@ Writer 类型其他方法是一些实际的写方法:
## 1.4.4 ReadWriter 类型和实例化 ##

ReadWriter 结构存储了 bufio.Reader 和 bufio.Writer 类型的指针(内嵌),它实现了 io.ReadWriter 结构。
```
```go
type ReadWriter struct {
*Reader
*Writer
}
```
ReadWriter 的实例化可以跟普通结构类型一样,也可以通过调用 bufio.NewReadWriter 函数来实现:只是简单的实例化 ReadWriter
```
```go
func NewReadWriter(r *Reader, w *Writer) *ReadWriter {
return &ReadWriter{r, w}
}
Expand All @@ -464,4 +464,4 @@ ReadWriter 的实例化可以跟普通结构类型一样,也可以通过调用

- [目录](/preface.md)
- 上一节:[fmt — 格式化IO](01.3.md)
- 下一节:[I/O 总结](01.5.md)
- 第二章:[文本](/chapter02/02.0.md)
18 changes: 9 additions & 9 deletions chapter02/02.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ func LastIndexAny(s, chars string) int
func LastIndexFunc(s string, f func(rune) bool) int
```

在 2.1.1 小节提到过,Contain 相关的函数内部调用的是响应的 Index 函数。
在 2.1.1 小节提到过,Contain 相关的函数内部调用的是相应的 Index 函数。

这一序列函数,只举 IndexFunc 的例子:

Expand Down Expand Up @@ -589,7 +589,7 @@ Hello, Gophers

## 2.1.12 Replacer 类型 ##

这是一个结构,没有导出任何字段,实例化通过 `func NewReplacer(oldnew ...string) *Replacer` 函数进行,其中不定参数 oldnew 是 old-new 对,即进行多个替换。如果 oldnew 长度与奇数,会导致 panic.
这是一个结构,没有导出任何字段,实例化通过 `func NewReplacer(oldnew ...string) *Replacer` 函数进行,其中不定参数 oldnew 是 old-new 对,即进行多个替换。如果 oldnew 长度为奇数,会导致 panic.

示例:
```go
Expand Down Expand Up @@ -636,29 +636,29 @@ type Builder struct {
buf []byte
}
```
该类型实现了 io 包下的 Writer, ByteWriter, StringWriter 等接口,可以向该对象内写入数据,Builder 没有实现 Reader 等接口,所以该类型不可读,但提供了 String 方法可以获取对象内的数据。
该类型实现了 `io` 包下的 Writer, ByteWriter, StringWriter 等接口,可以向该对象内写入数据,Builder 没有实现 Reader 等接口,所以该类型不可读,但提供了 String 方法可以获取对象内的数据。

```go
// 该方法向 b 写入一个字节
// WriteByte 方法向 b 写入一个字节
func (b *Builder) WriteByte(c byte) error
// WriteRune 方法向 b 写入一个字符
func (b *Builder) WriteRune(r rune) (int, error)
// WriteRune 方法向 b 写入字节数组 p
// Write 方法向 b 写入字节数组 p
func (b *Builder) Write(p []byte) (int, error)
// WriteRune 方法向 b 写入字符串 s
// WriteString 方法向 b 写入字符串 s
func (b *Builder) WriteString(s string) (int, error)
// Len 方法返回 b 的数据长度。
func (b *Builder) Len() int
// Cap 方法返回 b 的 cap。
func (b *Builder) Cap() int
// Grow 方法将 b 的 cap 至少增加 n (可能会更多)。如果 n 为负数,会导致 panic。
func (b *Builder) Grow(n int)
// Reset 方法将 b 清空 b 的所有内容。
// Reset 方法清空 b 的所有内容。
func (b *Builder) Reset()
// String 方法将 b 的数据以 string 类型返回。
func (b *Builder) String() string
```
Builder 有 4 个与写入相关的方法,这 4 个方法的 error 都总是为 nil.
Builder 有 4 个与写入相关的方法,这 4 个方法的 error 都总是为 nil

Builder 的 cap 会自动增长,一般不需要手动调用 Grow 方法。

Expand Down Expand Up @@ -699,4 +699,4 @@ fmt.Println(b.String())
# 导航 #

- [第二章 文本](/chapter02/02.0.md)
- 下一节:[bytes — byte slice 便利操作](02.2.md)
- 下一节:[bytes — byte slice 便利操作](02.2.md)
4 changes: 2 additions & 2 deletions chapter02/02.2.md
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ type Buffer struct {

对象可读取数据为 buf[off : len(buf)], off 表示进度下标,lastRead 表示最后读取的一个字符所占字节数,方便 Unread* 相关操作。

Buffer 可以通过 3 中方法初始化对象
Buffer 可以通过 3 种方法初始化对象
```go
a := bytes.NewBufferString("Hello World")
b := bytes.NewBuffer([]byte("Hello World"))
Expand Down Expand Up @@ -269,4 +269,4 @@ delim:N err: EOF
# 导航 #

- 上一节:[strings — 字符串操作](02.1.md)
- 下一节:[strconv — 字符串和基本数据类型之间转换](02.3.md)
- 下一节:[strconv — 字符串和基本数据类型之间转换](02.3.md)
Loading