From 523e81ec43052385e096a11a05399daebb8c3a32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E8=83=9C?= <53028087+DaTouJun@users.noreply.github.com> Date: Tue, 28 May 2024 19:12:37 +0800 Subject: [PATCH] Update ch1-03.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 如果在windows下默认换行可能是\r\n,如果仍然使用\n最后没有空行,其他行分割后都多\r,最后一行分割后没有\r将会计数错误 --- ch1/ch1-03.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch1/ch1-03.md b/ch1/ch1-03.md index 4780937..011046f 100644 --- a/ch1/ch1-03.md +++ b/ch1/ch1-03.md @@ -135,7 +135,7 @@ func countLines(f *os.File, counts map[string]int) { `map` 是一个由 `make` 函数创建的数据结构的引用。`map` 作为参数传递给某函数时,该函数接收这个引用的一份拷贝(copy,或译为副本),被调用函数对 `map` 底层数据结构的任何修改,调用者函数都可以通过持有的 `map` 引用看到。在我们的例子中,`countLines` 函数向 `counts` 插入的值,也会被 `main` 函数看到。(译注:类似于 C++ 里的引用传递,实际上指针是另一个指针了,但内部存的值指向同一块内存) -`dup` 的前两个版本以"流”模式读取输入,并根据需要拆分成多个行。理论上,这些程序可以处理任意数量的输入数据。还有另一个方法,就是一口气把全部输入数据读到内存中,一次分割为多行,然后处理它们。下面这个版本,`dup3`,就是这么操作的。这个例子引入了 `ReadFile` 函数(来自于`io/ioutil`包),其读取指定文件的全部内容,`strings.Split` 函数把字符串分割成子串的切片。(`Split` 的作用与前文提到的 `strings.Join` 相反。) +`dup` 的前两个版本以"流”模式读取输入,并根据需要拆分成多个行。理论上,这些程序可以处理任意数量的输入数据。还有另一个方法,就是一口气把全部输入数据读到内存中,一次分割为多行,然后处理它们。下面这个版本,`dup3`,就是这么操作的。这个例子引入了 `ReadFile` 函数(来自于`io/ioutil`包),其读取指定文件的全部内容,`strings.Split` 函数把字符串分割成子串的切片。(`Split` 的作用与前文提到的 `strings.Join` 相反。请注意如果在Windows下测试注意换行是否为\r\n,否则最后一行是否有空行将会影响结果。) 我们略微简化了 `dup3`。首先,由于 `ReadFile` 函数需要文件名作为参数,因此只读指定文件,不读标准输入。其次,由于行计数代码只在一处用到,故将其移回 `main` 函数。