我们按照之前的工作流程,还是先创建目录step-3
创建main.go
编写一个简单的main方法。
1. 打开Shell窗口,创建目录
$ mkdir step-3
$ cd step-3
2. 创建main.go
$ touch main.go
3. 使用熟悉的编辑器复制如下内容到main.go
package main
import ("fmt")
func main(){
fmt.Println("just a main func")
}
回到Shell窗口,执行如下命令
$ go mod init
$ go mod tidy
$ go run main.go
![f20c4f87a511337c65b5021328428584.png](https://i-blog.csdnimg.cn/blog_migrate/fae53008e9a3f78aa4373786068c65d9.jpeg)
过滤器
定义一个过滤器类型,本项目中,我们没使用这个过滤器,仅作为示例。
//ReadLinesFilter 文本行过滤器
type ReadLinesFilter func(btline []byte) bool
ReadLines
编写读取文本行的方法,两个参数分别是文件名和过滤器。
//ReadLines 从文件中读取文本行列表
//
// 支持错误处理
// 支持自定义文本行过滤器
func ReadLines(path string, filter ReadLinesFilter) (lines []string, err error) {
var (
file *os.File
part []byte
prefix bool
)
if file, err = os.Open(path); err != nil {
return
}
defer file.Close()
reader := bufio.NewReader(file)
//@todo:
buffer := bytes.NewBuffer(make([]byte, 0))
for {
if part, prefix, err = reader.ReadLine(); err != nil {
break
}
buffer.Write(part)
if !prefix {
if filter != nil {
if filter(buffer.Bytes()) {
lines = append(lines, buffer.String())
}
} else {
lines = append(lines, buffer.String())
}
buffer.Reset()
}
}
if err == io.EOF {
err = nil
}
return
}
源代码
package main
import (
"bufio"
"bytes"
"fmt"
"io"
"os"
)
func main() {
srcCheckLines, _ := ReadLines("./src_checkLines.txt", nil)
for _, checkLine := range srcCheckLines {
fmt.Println(checkLine)
}
}
//ReadLinesFilter 文本行过滤器
type ReadLinesFilter func(btline []byte) bool
//ReadLines 从文件中读取文本行列表
//
// 支持错误处理
// 支持自定义文本行过滤器
func ReadLines(path string, filter ReadLinesFilter) (lines []string, err error) {
var (
file *os.File
part []byte
prefix bool
)
if file, err = os.Open(path); err != nil {
return
}
defer file.Close()
reader := bufio.NewReader(file)
//@todo:
buffer := bytes.NewBuffer(make([]byte, 0))
for {
if part, prefix, err = reader.ReadLine(); err != nil {
break
}
buffer.Write(part)
if !prefix {
if filter != nil {
if filter(buffer.Bytes()) {
lines = append(lines, buffer.String())
}
} else {
lines = append(lines, buffer.String())
}
buffer.Reset()
}
}
if err == io.EOF {
err = nil
}
return
}
运行结果
回到Shell窗口
执行如下命令
$ go run main.go
![0601781f420c10658f066bb691f553bf.png](https://i-blog.csdnimg.cn/blog_migrate/7585f26723e8783244ef4b1542e3c733.png)
注意这里因为我们Terminal编码设置为GBK,所以正常输出了汉字。
macOS下Terminal缺省UTF8编码,则输出乱码。
![5adbb43f9b77c29a1a0f5d0be3081826.png](https://i-blog.csdnimg.cn/blog_migrate/b60343025059271227e82de881445fde.png)