0

0

Go语言:高效将多行数字字符串转换为二维整型数组

花韻仙語

花韻仙語

发布时间:2025-08-17 16:20:01

|

235人浏览过

|

来源于php中文网

原创

Go语言:高效将多行数字字符串转换为二维整型数组

本教程详细介绍了在Go语言中如何将包含空格和换行符分隔的数字字符串数据转换为二维整型数组。内容涵盖文件读取、字符串分割(按行和按字段)、字符串到整数的类型转换,并提供了清晰的代码示例。此外,文章还解释了fmt.Printf函数在使用不当导致%!(EXTRA )输出的原因及解决方案,旨在帮助开发者更有效地处理结构化文本数据。

go语言中处理文件中的结构化数据,特别是将文本形式的数字转换为可供程序操作的数值类型,是常见的任务。本文将以将包含空格分隔数字的多行字符串转换为二维整型切片(slice)为例,详细讲解实现步骤和相关技巧。

1. 从文件读取数据

在Go语言中,读取文件内容最常用且推荐的方式是使用os包中的ReadFile函数(Go 1.16+版本)。它能一次性将整个文件内容读取到一个字节切片中。

package main

import (
    "fmt"
    "os"     // 用于文件操作,Go 1.16+ 推荐使用 os.ReadFile
    "strconv" // 用于字符串到整数的转换
    "strings" // 用于字符串分割
    "log"    // 用于错误日志输出
)

func main() {
    // 假设存在一个名为 sudoku1.txt 的文件,内容如下:
    // 1 4 0 0 2 5
    // 3 0 0 1 0 0
    // 0 0 0 0 0 0
    filePath := "sudoku1.txt" 

    // 使用 os.ReadFile 读取文件内容
    contentBytes, err := os.ReadFile(filePath)
    if err != nil {
        log.Fatalf("文件读取失败: %v", err) // 如果文件读取失败,则终止程序并打印错误
    }

    // 将读取到的字节切片转换为字符串
    fileContent := string(contentBytes)
    fmt.Println("--- 原始文件内容 ---")
    fmt.Println(fileContent)

    // 调用解析函数,将字符串内容转换为二维整型数组
    board, err := parseStringTo2DIntArray(fileContent)
    if err != nil {
        log.Fatalf("解析字符串到二维数组失败: %v", err) // 如果解析失败,则终止程序并打印错误
    }

    fmt.Println("\n--- 转换后的二维整型数组 ---")
    fmt.Println(board)

    // 解决 fmt.Printf 的额外参数输出问题,详见下文解析
    fmt.Println("\n--- fmt.Printf 额外参数问题解析 ---")
    // 模拟原始问题中 `fmt.Printf(read_file("sudoku1.txt"))` 导致 `%!(EXTRA )` 的情况
    fmt.Println("当 `fmt.Printf(函数调用)` 而该函数返回多个值时,如果 `fmt.Printf` 的第一个参数(格式字符串)没有足够的格式化动词(如 `%s`, `%v` 等)来匹配所有传入的参数,Go 运行时会将其余未匹配的参数标记为“额外”参数,并以 `%!(EXTRA )` 的形式输出。")
    fmt.Println("例如,如果一个函数 `read_file` 返回 `(string, error)`,而你直接 `fmt.Printf(read_file(...))`,那么 `read_file` 返回的第二个 `error` 值(通常为 `nil`)没有对应的格式化动词,就会被标记为额外参数。")

    fmt.Println("\n**正确的使用方式示例:**")
    // 假设有一个函数 `exampleFunc` 返回 (string, error)
    // func exampleFunc() (string, error) { return "Go 语言教程", nil }

    // 方式一:使用 fmt.Println,它会自动处理多个参数并添加空格
    fmt.Println("使用 fmt.Println(s, err) 打印所有返回值:")
    sVal := "Go 语言教程"
    errVal := error(nil) // 模拟没有错误
    fmt.Println(sVal, errVal) // 输出: Go 语言教程 

    // 方式二:使用 fmt.Printf 并提供明确的格式化动词
    fmt.Println("\n使用 fmt.Printf(\"%s\\n\", s) 仅打印字符串部分:")
    fmt.Printf("%s\n", sVal) // 输出: Go 语言教程

    fmt.Println("\n使用 fmt.Printf(\"内容: %s, 错误: %v\\n\", s, err) 打印所有返回值:")
    fmt.Printf("内容: %s, 错误: %v\n", sVal, errVal) // 输出: 内容: Go 语言教程, 错误: 
}

2. 将字符串数据解析为二维整型数组

核心的解析逻辑包括三个主要步骤:按行分割、按字段分割、字符串到整数转换。

万彩商图
万彩商图

专为电商打造的AI商拍工具,快速生成多样化的高质量商品图和模特图,助力商家节省成本,解决素材生产难、产图速度慢、场地设备拍摄等问题。

下载
// parseStringTo2DIntArray 负责将包含数字的字符串解析为二维整型数组。
// 它处理多行输入,每行中的数字由空格分隔。
func parseStringTo2DIntArray(s string) ([][]int, error) {
    // 1. 按行分割字符串
    // strings.Split(s, "\n") 会将字符串按换行符分割成切片。
    // 注意:如果字符串以换行符结尾,Split 会在切片末尾生成一个空字符串。
    rows := strings.Split(s, "\n")
    var board [][]int // 声明一个二维整型切片用于存储结果

    for _, rowStr := range rows {
        // 过滤掉空行。strings.TrimSpace(rowStr) 用于去除行两端的空白符,
        // 确保即使行中只有空白符也能被识别为空行。
        if strings.TrimSpace(rowStr) == "" {
            continue
        }

        // 2.

相关专题

更多
printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

72

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

274

2023.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

246

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

202

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1428

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

606

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

546

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

539

2024.04.29

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 3.8万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2万人学习

Go 教程
Go 教程

共32课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号