mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-11 22:06:51 +08:00
12.3-12.6
This commit is contained in:
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
## 翻译进度
|
## 翻译进度
|
||||||
|
|
||||||
12.2 [文件读写](eBook/12.2.md)
|
12.6 [用切片读写文件](eBook/12.6.md)
|
||||||
|
|
||||||
## 支持本书
|
## 支持本书
|
||||||
|
|
||||||
|
@@ -30,4 +30,4 @@ Golang 编程:245386165
|
|||||||
|
|
||||||
|更新日期 |更新内容
|
|更新日期 |更新内容
|
||||||
|----------|------------------
|
|----------|------------------
|
||||||
|2015-11-12|12.2 文件读写
|
|2015-11-13|12.6 用切片读写文件
|
||||||
|
4
TOC.md
4
TOC.md
@@ -107,3 +107,7 @@
|
|||||||
- 第12章:[读写数据](12.0.md)
|
- 第12章:[读写数据](12.0.md)
|
||||||
- 12.1 [读取用户的输入](12.1.md)
|
- 12.1 [读取用户的输入](12.1.md)
|
||||||
- 12.2 [文件读写](12.2.md)
|
- 12.2 [文件读写](12.2.md)
|
||||||
|
- 12.3 [文件拷贝](12.3.md)
|
||||||
|
- 12.4 [从命令行读取参数](12.4.md)
|
||||||
|
- 12.5 [用 buffer 读取文件](12.5.md)
|
||||||
|
- 12.6 [用切片读写文件](12.6.md)
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
如何拷贝一个文件到另一个文件?最简单的方式就是使用 io 包:
|
如何拷贝一个文件到另一个文件?最简单的方式就是使用 io 包:
|
||||||
|
|
||||||
示例 12.10 [filecopy.go](examples/chapter_12/filecopy.go):
|
示例 12.10 [filecopy.go](examples/chapter_12/filecopy.go):
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// filecopy.go
|
// filecopy.go
|
||||||
package main
|
package main
|
||||||
@@ -33,11 +34,9 @@ func CopyFile(dstName, srcName string) (written int64, err error) {
|
|||||||
|
|
||||||
return io.Copy(dst, src)
|
return io.Copy(dst, src)
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
注意 `defer` 的使用:当打开目标文件时发生了错误,那么 `defer` 仍然能够确保 `src.Close()`
|
注意 `defer` 的使用:当打开目标文件时发生了错误,那么 `defer` 仍然能够确保 `src.Close()` 执行。如果不这么做,文件会一直保持打开状态并占用资源。
|
||||||
执行。如果不这么做,文件会一直保持打开状态并占用资源。
|
|
||||||
|
|
||||||
## 链接
|
## 链接
|
||||||
|
|
||||||
|
@@ -1,9 +1,11 @@
|
|||||||
# 12.4 从命令行读取参数
|
# 12.4 从命令行读取参数
|
||||||
|
|
||||||
## 12.4.1 os 包
|
## 12.4.1 os 包
|
||||||
|
|
||||||
os 包中有一个 string 类型的切片变量 `os.Args`,用来处理一些基本的命令行参数,它在程序启动后读取命令行输入的参数。来看下面的打招呼程序:
|
os 包中有一个 string 类型的切片变量 `os.Args`,用来处理一些基本的命令行参数,它在程序启动后读取命令行输入的参数。来看下面的打招呼程序:
|
||||||
|
|
||||||
示例 12.11 [os_args.go](examples/chapter_12/os_args.go):
|
示例 12.11 [os_args.go](examples/chapter_12/os_args.go):
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// os_args.go
|
// os_args.go
|
||||||
package main
|
package main
|
||||||
@@ -32,9 +34,11 @@ func main() {
|
|||||||
这个命令行参数会放置在切片 `os.Args[]` 中(以空格分隔),从索引1开始(`os.Args[0]` 放的是程序本身的名字,在本例中是 `os_args`)。函数 `strings.Join` 以空格为间隔连接这些参数。
|
这个命令行参数会放置在切片 `os.Args[]` 中(以空格分隔),从索引1开始(`os.Args[0]` 放的是程序本身的名字,在本例中是 `os_args`)。函数 `strings.Join` 以空格为间隔连接这些参数。
|
||||||
|
|
||||||
**练习 12.5**:[hello_who.go](exercises/chapter_12/hello_who.go)
|
**练习 12.5**:[hello_who.go](exercises/chapter_12/hello_who.go)
|
||||||
|
|
||||||
写一个"Hello World"的变种程序:把人的名字作为程序命令行执行的一个参数,比如: `hello_who Evan Michael Laura` 那么会输出`Hello Evan Michael Laura`!
|
写一个"Hello World"的变种程序:把人的名字作为程序命令行执行的一个参数,比如: `hello_who Evan Michael Laura` 那么会输出`Hello Evan Michael Laura`!
|
||||||
|
|
||||||
## 12.4.2 flag 包
|
## 12.4.2 flag 包
|
||||||
|
|
||||||
flag 包有一个扩展功能用来解析命令行选项。但是通常被用来替换基本常量,例如,在某些情况下我们希望在命令行给常量一些不一样的值。(参看 19 章的项目)
|
flag 包有一个扩展功能用来解析命令行选项。但是通常被用来替换基本常量,例如,在某些情况下我们希望在命令行给常量一些不一样的值。(参看 19 章的项目)
|
||||||
|
|
||||||
在 flag 包中一个 Flag 被定义成一个含有如下字段的结构体:
|
在 flag 包中一个 Flag 被定义成一个含有如下字段的结构体:
|
||||||
@@ -97,13 +101,13 @@ func main() {
|
|||||||
|
|
||||||
当在命令行(Windows)中执行:`echo.exe A B C`,将输出:`A B C`;执行 `echo.exe -n A B C`,将输出:
|
当在命令行(Windows)中执行:`echo.exe A B C`,将输出:`A B C`;执行 `echo.exe -n A B C`,将输出:
|
||||||
|
|
||||||
```go
|
```
|
||||||
A
|
A
|
||||||
B
|
B
|
||||||
C
|
C
|
||||||
```
|
```
|
||||||
|
|
||||||
每个字符的输出都新起一行,每次都在输出的数据前面打印使用帮助信息:`-n=false: print newline`
|
每个字符的输出都新起一行,每次都在输出的数据前面打印使用帮助信息:`-n=false: print newline`。
|
||||||
|
|
||||||
对于 `flag.Bool` 你可以设置布尔型 flag 来测试你的代码,例如定义一个 flag `processedFlag`:
|
对于 `flag.Bool` 你可以设置布尔型 flag 来测试你的代码,例如定义一个 flag `processedFlag`:
|
||||||
|
|
||||||
@@ -119,16 +123,12 @@ if *processedFlag { // found flag -proc
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
要给 flag 定义其它类型,可以使用 `flag.Int()`,`flag.Float64`,`flag.String()`
|
要给 flag 定义其它类型,可以使用 `flag.Int()`,`flag.Float64`,`flag.String()`。
|
||||||
|
|
||||||
在 15.8 章你将找到一个具体的例子。
|
|
||||||
|
|
||||||
|
|
||||||
|
在第 15.8 章你将找到一个具体的例子。
|
||||||
|
|
||||||
## 链接
|
## 链接
|
||||||
|
|
||||||
- [目录](directory.md)
|
- [目录](directory.md)
|
||||||
- 上一节:[文件拷贝](12.3.md)
|
- 上一节:[文件拷贝](12.3.md)
|
||||||
- 下一节:[用buffer读取文件](12.5.md)
|
- 下一节:[用buffer读取文件](12.5.md)
|
||||||
|
|
||||||
|
|
||||||
|
@@ -47,8 +47,8 @@ func main() {
|
|||||||
在 12.6 章节,我们将看到如何使用缓冲写入。
|
在 12.6 章节,我们将看到如何使用缓冲写入。
|
||||||
|
|
||||||
**练习 12.5**:[cat_numbered.go](exercises/chapter_12/cat_numbered.go)
|
**练习 12.5**:[cat_numbered.go](exercises/chapter_12/cat_numbered.go)
|
||||||
扩展 cat.go 例子,使用 flag 添加一个选项,目的是为每一行头部加入一个行号。使用 `cat -n test` 测试输出。
|
|
||||||
|
|
||||||
|
扩展 cat.go 例子,使用 flag 添加一个选项,目的是为每一行头部加入一个行号。使用 `cat -n test` 测试输出。
|
||||||
|
|
||||||
## 链接
|
## 链接
|
||||||
|
|
||||||
|
@@ -20,10 +20,9 @@ func cat(f *os.File) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
下面的代码来自于 `cat2.go`,使用了 os 包中的 `os.file` 和 `Read` 方法;`cat2.go` 与 `cat.go` 具有同样的功能。
|
|
||||||
|
|
||||||
|
下面的代码来自于 `cat2.go`,使用了 os 包中的 `os.file` 和 `Read` 方法;`cat2.go` 与 `cat.go` 具有同样的功能。
|
||||||
|
|
||||||
示例 12.14 [cat2.go](examples/chapter_12/cat2.go):
|
示例 12.14 [cat2.go](examples/chapter_12/cat2.go):
|
||||||
|
|
||||||
@@ -69,7 +68,6 @@ func main() {
|
|||||||
f.Close()
|
f.Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 链接
|
## 链接
|
||||||
|
Reference in New Issue
Block a user