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()) } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 为什么构造函数需要尽可能的简单
· 探秘 MySQL 索引底层原理,解锁数据库优化的关键密码(下)
· 大模型 Token 究竟是啥:图解大模型Token
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 如何开发 MCP 服务?保姆级教程!
· C# 工业视觉开发必刷20道 Halcon 面试题
· 从零散笔记到结构化知识库:我的文档网站建设之路
· 1.net core 工作流WorkFlow流程(介绍)