Skip to content

Commit c466fcc

Browse files
committed
一些代码
1 parent 7fb1a60 commit c466fcc

File tree

30 files changed

+1139
-2
lines changed

30 files changed

+1139
-2
lines changed

SUMMARY.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@
3333
- 7.2 encoding/json — json 解析
3434
- 7.3 encoding/xml — xml 解析
3535
- 7.4 encoding/gob — golang 自定义二进制格式
36-
- 7.5 csv — 逗号分隔值文件
36+
- 7.5 encoding/csv — 逗号分隔值文件
3737
* [第八章 数据压缩与归档](chapter08/08.0.md)
3838
- 8.1 [flate - DEFLATE 压缩算法](chapter08/08.1.md)
3939
- 8.2 compress/zlib — gnu zlib 压缩
4040
- 8.3 compress/gzip — 读写 gnu zip 文件
4141
- 8.4 compress/bzip2 — bzip2 压缩
42-
- 8.5 archive/tar — tar 归档访问
42+
- 8.5 archive/tar — tar 档案读写
4343
- 8.6 archive/zip — zip 归档访问
4444
* [第九章 测试](chapter09/09.0.md)
4545
- 9.1 [testing - 单元测试](chapter09/09.1.md)

chapter07/07.5.md

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# 7.5 encoding/csv — 逗号分隔值文件
2+
3+
对 CSV 大家应该不陌生。因为它可以通过 Excel 打开(虽然 CSV 是纯文本格式),而且解析简单方便,因此,很多时候,我们做导出功能时,都会选择导出 CSV 格式。当然,导入我们也会期望使用 CSV 格式,这时往往会提供模板下载,让用户通过修改这个模板数据,然后导入。而这个模板往往也会采用 CSV 格式。通常,数据库数据导出也支持 CSV 格式。
4+
5+
关于 CSV 的解释:
6+
7+
> CSV,即逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV 文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
8+
9+
Go 语言标准库支持对 CSV 格式的读写。
10+
11+
## 7.5.1 简述
12+
13+
csv 包用于读取和写入逗号分隔值(CSV)文件。CSV 文件类型有很多种,该包支持 RFC 4180 中描述的格式。
14+
15+
一个 csv 文件包含每个记录一到多个字段的零到多个记录。每条记录由换行符分隔。最后一条记录可以选择是否由换行符结束。
16+
17+
```bash
18+
field1,field2,field3
19+
```
20+
21+
空白视为字段的一部分。
22+

chapter08/08.5.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# 8.1 archive/tar — tar 档案读写
2+
3+
熟悉 Linux 的朋友,对于 tar 格式的文件应该不会陌生。
4+
5+
6+

chapter14/14.0.md

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# 第十四章 运行时特性 #
2+
3+
运行时(runtime)是 Go 语言最重要的部分,关于它包含的内容,比如内存分配、调度、高级数据结构的实现等,都是高级进阶内容,超出了本书的范围。
4+
5+
本章主要着重介绍使用方面,在日常开发中可能会用到 runtime 包或子包中的某些功能,它们也是标准库的一部分。
6+
7+
# 导航 #
8+
9+
- [第十三章](/chapter13/01.0.md)
10+
- 下一节:[runtime 包](14.1.md)

chapter14/14.2.md

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# 14.2 io — 基本的 IO 接口 #
2+
3+
4+
5+
# 导航 #
6+
7+
- 上一节:[runtime 包](14.1.md)
8+
- 下一节:[]()
9+

code/chapter08/result/chapter08/result/polarisxu.tar

Whitespace-only changes.
+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package main
2+
3+
import (
4+
"archive/tar"
5+
"log"
6+
"os"
7+
"path/filepath"
8+
)
9+
10+
func main() {
11+
f, err := os.Create("result/polarisxu.tar")
12+
if err != nil {
13+
log.Fatal(err)
14+
}
15+
defer f.Close()
16+
17+
tw := tar.NewWriter(f)
18+
defer tw.Close()
19+
20+
root, err := filepath.Abs("..")
21+
if err != nil {
22+
log.Fatal(err)
23+
}
24+
25+
err = ScanDir(tw, root, root)
26+
if err != nil {
27+
os.Remove("result/polarisxu.tar")
28+
log.Fatal(err)
29+
}
30+
}
31+
32+
func ScanDir(tw *tar.Writer, root, dirName string) error {
33+
dirEntries, err := os.ReadDir(dirName)
34+
if err != nil {
35+
return err
36+
}
37+
38+
for _, dirEntry := range dirEntries {
39+
newPath := dirName + "/" + dirEntry.Name()
40+
if dirEntry.IsDir() {
41+
if err = ScanDir(tw, root, newPath); err != nil {
42+
return err
43+
}
44+
} else {
45+
hdr := &tar.Header{
46+
Name: dirName[len(root):] + "/" + dirEntry.Name(),
47+
// Mode: int64(dirEntry.Type().Perm()),
48+
}
49+
fileInfo, err := dirEntry.Info()
50+
if err != nil {
51+
return err
52+
}
53+
hdr.Mode = int64(fileInfo.Mode().Perm())
54+
body, err := os.ReadFile(newPath)
55+
if err != nil {
56+
return err
57+
}
58+
hdr.Size = int64(len(body))
59+
if err = tw.WriteHeader(hdr); err != nil {
60+
return err
61+
}
62+
63+
if _, err = tw.Write(body); err != nil {
64+
return err
65+
}
66+
}
67+
}
68+
69+
return nil
70+
}

code/chapter08/result/install.bat

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
@echo off
2+
3+
setlocal
4+
5+
if exist install.bat goto ok
6+
echo install.bat must be run from its folder
7+
goto end
8+
9+
:ok
10+
11+
set OLDGOPATH=%GOPATH%
12+
set GOPATH=%~dp0;%~dp0..\thirdparty
13+
14+
gofmt -w src
15+
16+
go install chapter01/io
17+
18+
set GOPATH=%OLDGOPATH%
19+
20+
:end
21+
echo finished

code/chapter08/result/install.sh

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
if [ ! -f install.sh ]; then
6+
echo 'install must be run within its container folder' 1>&2
7+
exit 1
8+
fi
9+
10+
CURDIR=`pwd`
11+
OLDGOPATH="$GOPATH"
12+
export GOPATH="$CURDIR"
13+
14+
gofmt -w src
15+
16+
go install ./...
17+
18+
export GOPATH="$OLDGOPATH"
19+
export PATH="$OLDPATH"
20+
21+
echo 'finished'
22+

code/chapter08/result/polarisxu.tar

37.5 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from file
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package main
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"os"
7+
)
8+
9+
func ByteRWerExample() {
10+
FOREND:
11+
for {
12+
fmt.Println("请输入要通过WriteByte写入的一个ASCII字符(b:返回上级;q:退出):")
13+
var ch byte
14+
fmt.Scanf("%c\n", &ch)
15+
switch ch {
16+
case 'b':
17+
fmt.Println("返回上级菜单!")
18+
break FOREND
19+
case 'q':
20+
fmt.Println("程序退出!")
21+
os.Exit(0)
22+
default:
23+
buffer := new(bytes.Buffer)
24+
err := buffer.WriteByte(ch)
25+
if err == nil {
26+
fmt.Println("写入一个字节成功!准备读取该字节……")
27+
newCh, _ := buffer.ReadByte()
28+
fmt.Printf("读取的字节:%c\n", newCh)
29+
} else {
30+
fmt.Println("写入错误")
31+
}
32+
}
33+
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"util"
6+
)
7+
8+
func main() {
9+
util.Welcome()
10+
MainMenu()
11+
}
12+
13+
func MainMenu() {
14+
MAINFOR:
15+
for {
16+
fmt.Println("")
17+
fmt.Println("*******请选择示例:*********")
18+
fmt.Println("1 表示 io.Reader 示例")
19+
fmt.Println("2 表示 io.ByteReader/ByteWriter 示例")
20+
fmt.Println("q 退出")
21+
fmt.Println("***********************************")
22+
23+
var ch string
24+
fmt.Scanln(&ch)
25+
26+
switch ch {
27+
case "1":
28+
ReaderExample()
29+
case "2":
30+
ByteRWerExample()
31+
case "q":
32+
fmt.Println("程序退出!")
33+
break MAINFOR
34+
default:
35+
fmt.Println("输入错误!")
36+
continue
37+
}
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// io.Reader 接口示例
2+
package main
3+
4+
import (
5+
"fmt"
6+
"io"
7+
"os"
8+
"strings"
9+
"util"
10+
)
11+
12+
func ReaderExample() {
13+
FOREND:
14+
for {
15+
readerMenu()
16+
17+
var ch string
18+
fmt.Scanln(&ch)
19+
var (
20+
data []byte
21+
err error
22+
)
23+
switch strings.ToLower(ch) {
24+
case "1":
25+
fmt.Println("请输入不多于9个字符,以回车结束:")
26+
data, err = ReadFrom(os.Stdin, 11)
27+
case "2":
28+
file, err := os.Open(util.GetProjectRoot() + "/src/chapter01/io/01.txt")
29+
if err != nil {
30+
fmt.Println("打开文件 01.txt 错误:", err)
31+
continue
32+
}
33+
data, err = ReadFrom(file, 9)
34+
file.Close()
35+
case "3":
36+
data, err = ReadFrom(strings.NewReader("from string"), 12)
37+
case "4":
38+
fmt.Println("暂未实现!")
39+
case "b":
40+
fmt.Println("返回上级菜单!")
41+
break FOREND
42+
case "q":
43+
fmt.Println("程序退出!")
44+
os.Exit(0)
45+
default:
46+
fmt.Println("输入错误!")
47+
continue
48+
}
49+
50+
if err != nil {
51+
fmt.Println("数据读取失败,可以试试从其他输入源读取!")
52+
} else {
53+
fmt.Printf("读取到的数据是:%s\n", data)
54+
}
55+
}
56+
}
57+
58+
func ReadFrom(reader io.Reader, num int) ([]byte, error) {
59+
p := make([]byte, num)
60+
n, err := reader.Read(p)
61+
if n > 0 {
62+
return p[:n], nil
63+
}
64+
return p, err
65+
}
66+
67+
func readerMenu() {
68+
fmt.Println("")
69+
fmt.Println("*******从不同来源读取数据*********")
70+
fmt.Println("*******请选择数据源,请输入:*********")
71+
fmt.Println("1 表示 标准输入")
72+
fmt.Println("2 表示 普通文件")
73+
fmt.Println("3 表示 从字符串")
74+
fmt.Println("4 表示 从网络")
75+
fmt.Println("b 返回上级菜单")
76+
fmt.Println("q 退出")
77+
fmt.Println("***********************************")
78+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"path/filepath"
7+
)
8+
9+
func main() {
10+
filepath.Walk("../../..", func(path string, info os.FileInfo, err error) error {
11+
if info.IsDir() {
12+
return nil
13+
}
14+
15+
fmt.Println("file:", info.Name(), "in directory:", path)
16+
17+
return nil
18+
})
19+
}

0 commit comments

Comments
 (0)