You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang 去除字符串后缀后按原换行格式写入文件问题求解

问题原因

你的代码存在两个核心问题导致结果不符合预期:

  1. 用strings.Split(string(a), "\n")按换行拆分字符串后,得到的每个切片元素都不带换行符,你直接写入处理后的内容时没有补加换行,最终所有内容会拼接成一整行。
  2. 如果你的源文件是Windows格式(行尾为\r\n),按\n拆分后每行末尾会残留\r字符,导致strings.TrimSuffix(i, "L3")无法匹配到末尾的L3,后缀去除逻辑失效。

修复方案

  • 改用strings.SplitLines()方法拆分文件内容,该方法会自动适配不同操作系统的换行格式,拆分结果不会残留多余控制字符,能保证后缀去除逻辑正常运行。
  • 每行处理完成后写入时,手动补加换行符\n即可保持原有换行格式。
  • 你已经通过defer f.Close()声明了文件自动关闭,末尾重复调用f.Close()属于冗余代码可以删除。

修复后代码

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "strings"
)

func main() {
    // 读取源文件
    n, err := ioutil.ReadFile("box_1")
    if err != nil {
        fmt.Println(err)
        return
    }
    a := string(n)

    // 按行拆分内容,自动适配不同系统换行格式
    sliceData := strings.SplitLines(a)

    // 创建目标文件
    f, err := os.Create("box_2")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()

    for _, line := range sliceData {
        // 跳过空行,避免写入多余空行
        if line == "" {
            continue
        }
        trimmedLine := strings.TrimSuffix(line, "L3")
        fmt.Println(trimmedLine)
        // 写入处理后的内容 + 换行符
        _, err = f.WriteString(trimmedLine + "\n")
        if err != nil {
            fmt.Println("写入文件失败:", err)
            return
        }
    }
}

如果需要生成Windows格式的换行,将trimmedLine + "\n"改为trimmedLine + "\r\n"即可。

内容的提问来源于stack exchange,提问作者elzwhere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 02:06:04