Skip to content

Commit

Permalink
Updates 11-hello.md
Browse files Browse the repository at this point in the history
Auto commit by GitBook Editor
  • Loading branch information
FengNote committed Sep 30, 2016
1 parent 5897162 commit 51bc895
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions 11-hello.md
Original file line number Diff line number Diff line change
Expand Up @@ -220,15 +220,15 @@ dup1中的格式化字符串还包括一个tab符 \t和一个换行符\n。Strin

函数os.Open返回两个值。第一个值是一个打开了的文件(\*os.File),随后它将被Scanner打开读取。

os.Open返回的第二个结果是一个内建的error类型的值。如果err的值为內建的特殊值nil,说明文件被成功的打开了。文件会被读取,并且读到文件尾的时候,Close会关闭文件并释放所有的资源。换句话说,如果err不是nil,那么肯定什么地方出了问题。这种情况下可以通过err的取值来判断到底是哪一种类型的错误发生了。我们简化的错误处理系统会把一个标示错误的信息打印到标准错误流中,这是通过Fprintf和verb %v完成的,该函数把错误值以默认的类型格式打印到第一个参数指定的标准输出流中。然后dup继续处理文件列表中的下一个文件,continue语句直接跳到下一个for循环迭代中。
os.Open返回的第二个结果是一个内建的error类型的值。如果err的值为內建的特殊值nil,说明文件被成功的打开了。文件会被读取,并且读到文件尾的时候,Close会关闭文件并释放所有的资源。换句话说,如果err不是nil,那么肯定什么地方出了问题。这种情况下可以通过err的取值来判断到底是哪一种类型的错误发生了。我们最直接能想到的的错误处理系统就是向标准错误流打印一条标示错误的信息。这是通过Fprintf和verb %v完成的,该函数把错误值以默认的类型格式打印到第一个参数指定的标准输出流中。然后dup继续处理文件列表中的下一个文件,continue语句直接跳到下一个for循环迭代中。

为了使代码保持精简,我们在先前的例子里故意不太关心错误处理。很明确的是我们肯定需要对os.Open这样的函数进行错误检查,不过我们一般会忽略在input.Scan读取输入的过程中可能会出现的err,因为后者的可能性比较低。我们会标记处哪些地方我们有意跳过了错误检查。在5.4章节中我们将会详细的讨论错误处理相关的话题。

注意对于countLines的调用先于这个函数的定义。函数和其他包级别的实体都可以以任意的顺序进行申明。
注意对于countLines的调用在位置上先于这个函数的定义。函数和其他包级别的实体都可以以任意的顺序进行申明。

map实际上是对make创造出的数据结构的一个引用。当map作为参数传递给函数是,函数接到的是一个引用的拷贝,所以函数内部对所引用的数据结构做的任何修改都可以在调用端的map引用产生同样可见的影响。在我们的例子中,函数countLines插入到map counts中的数值,在调用countLines的main函数中也是可见的。

上述dup程序是在流模式中进行操作的。在流模式中输入流读取后根据需要被分为了一行一行的数据,所以理论上这些程序可以处理任意大小的输入数据。另外还有一种方式是一口气把所有的输入数据都一次性读取到内存中,然后一次性的全部切成一行一行的数据,再逐行进行处理。接下来的这一版dup3就是这么玩儿的。这里会引入ReadFile函数(该函数属于io\/ioutil包),该函数会读取文件名对应文件中的所有数据,然后用strings.Split函数把数据切成slice(split是我们刚才看到的strings,Join的反操作)。
上述dup程序是在流模式中进行操作的。在流模式中输入流读取后根据需要被分割成了一行一行的数据,所以理论上这些程序可以处理任意大小的输入数据。另外还有一种方式是一口气把所有的输入数据都一次性读取到内存中,然后一次性的全部切成一行一行的数据,再逐行进行处理。接下来的这一版dup3就是这么玩儿的。这里会引入ReadFile函数(该函数属于io\/ioutil包),该函数会读取文件名对应文件中的所有数据,然后用strings.Split函数把数据切成slice(split是我们刚才看到的strings,Join的反操作)。

我们稍微简化了一下dup3. 首先,它只读取文件,不再读取标准输入,因为ReadFile要求一个文件名作为参数。其次,我们把数据行计数逻辑又放回到了main函数里,因为现在只有一个地方需要这些逻辑。

Expand All @@ -244,7 +244,7 @@ ReadFile返回一个byte类型的slice,必须把它先转为string类型然后

\/\/TODO p13

这次代码里会有一些新的组件,包括const声明,struct类型,还有组合字面量(composite literals).和其他大多数示例代码不同,这个例子还牵涉到浮点运算。我们在这里只是简要的讨论一下这些话题,后面的章节会逐一进行相应的深入讨论。目前的主要目标是给你一个大概的映像看看Go程序应该长什么样,利用Go语言和其标准库写出来的程序到底可以轻松的完成哪些类型的任务。所以这里我们暂时不求细节俱到,先只看整体的概貌即可。
这次代码里会有一些新的组件,包括const声明,struct类型,还有组合字面量(composite literals).和其他大多数示例代码不同,这个例子还牵涉到浮点运算。我们在这里只是简要的讨论一下这些话题,后面的章节会逐一进行相应的深入讨论。目前的主要目标是给你一个大概的印象看看Go程序应该长什么样,利用Go语言和其标准库写出来的程序到底可以轻松的完成哪些类型的任务。所以这里我们暂时不求细节俱到,先只看整体的概貌即可。

\/\/TODO p13

Expand Down

0 comments on commit 51bc895

Please sign in to comment.