随笔 - 56  文章 - 0 评论 - 0 阅读 - 50716

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package main
 
import (
    "bufio"
    "fmt"
    "io"
    "os"
)
 
func main() {
 
    var inFile, outFile *os.File
 
    if inFile, err := os.Open("in.txt"); inFile == nil { //inFile 是指针类型可以赋值nil (1)
        fmt.Println(err.Error())
        inFile = os.Stdin
    }
 
    defer inFile.Close()
    if outFile, err := os.OpenFile("out.txt", os.O_RDWR, 0766); err != nil {
        fmt.Println(outFile) ////这里必须用一下outFile , 否则go编译器扯淡报错outFile未使用过,或者也可以象(1)那样反过来不判断err而判断另一个不空
        fmt.Println(err.Error())
        outFile = os.Stdout
    }
    defer outFile.Close()
 
    reader, writer := bufio.NewReader(inFile), bufio.NewWriter(outFile)
 
    var s bytes.Buffer
    for {
        line, err := reader.ReadString('\n') //nil 只能赋值给指针和引用类型,报错 can not convert nil to string
        if err != nil && err != io.EOF { //真出错了,而不是到结尾了
            break
        }
        //bytes.Buffer 类似于 java 中的 StringBuilder 处理大量字符串连接非常好
        s.WriteString(line)
        //字符串是值类型不能有其他值,也不能用空字符串标识到了文件结尾,这会和空行混淆
        if err == io.EOF { //到结尾了
            break
        }
    }
 
    /*
    //另一种感觉更清晰的写法
    for line, err := reader.ReadString('\n'); err == nil || err == io.EOF; line, err = reader.ReadString('\n') {
        s.WriteString(line)
        if err == io.EOF {
            break
        }
    }
    */
 
    if _, err := writer.WriteString(s); err == nil {
        writer.Flush()
    } else {
        fmt.Println(err.Error())
    }
 
}
posted on   scala  阅读(205)  评论(0编辑  收藏  举报
编辑推荐:
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 为什么构造函数需要尽可能的简单
· 探秘 MySQL 索引底层原理,解锁数据库优化的关键密码(下)
· 大模型 Token 究竟是啥:图解大模型Token
· 35岁程序员的中年求职记:四次碰壁后的深度反思
阅读排行:
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 如何开发 MCP 服务?保姆级教程!
· C# 工业视觉开发必刷20道 Halcon 面试题
· 从零散笔记到结构化知识库:我的文档网站建设之路
· 1.net core 工作流WorkFlow流程(介绍)
点击右上角即可分享
微信分享提示