Golang中如何将字节切片元素转换为字符串

Golang中如何将字节切片元素转换为字符串 在我的Go脚本中,我运行了一个shell命令来获取目录列表并存储数据。我使用os/exec包来运行shell命令并获取输出。输出以[]byte形式返回。我希望能够遍历[]byte并以字符串格式输出元素,这样就能看到文件的实际名称。

这是我的代码:

package main

import (
	“log”
	“os/exec”
	“os”
	“fmt”
	“path/filepath”
	“time”
	“strings”
)

func main() {
	var dir1 = “/dir/dir1”
	files, err := exec.Command(“ls”, lspDir).Output()
	if err != nil {
		fmt.Println("Issue finding files: ", err)
	}

	files2 := string(files[:]) // converts all element of files to string
	fmt.Println(files2) // this shows me all the elements in string format

	for f, _ := range files2 {
		fmt.Println(f) // This does not print each element in string format
	}
}

更多关于Golang中如何将字节切片元素转换为字符串的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

是的,我以前经常把它们混用。后来我养成了默认忽略索引的习惯,只有在需要时才使用它。

很高兴这个方法有效 😄

更多关于Golang中如何将字节切片元素转换为字符串的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢,这个方法有效。表情

codekid:

for _, f := range filesArray { fmt.Println("shazam: ", f) // remove shazam ! this is only to demonstrate that it is iterable }

我完全没注意到自己不小心把 _, f 写反了。现在也意识到需要像你那样使用 filesArray。

我能发现的两个错误是:

  1. 编辑: files2 可以是可迭代的,但它是一个字符串。
    解决方案filesArray := strings.Split(files2, "\n")

  2. f 将是 filesArray 的索引,而你忽略的 _ 是实际的值。
    解决方案for _, f := range filesArray {}

所以最终你的代码应该如下所示,以实现你想要的效果:

package main

import (
	"strings"
	"fmt"
	"os/exec"
)

func main() {
	var dir1 = "/dir/dir1"
	files, err := exec.Command("ls", lspDir).Output()
	if err != nil {
		fmt.Println("Issue finding files: ", err)
	}

	files2 := string(files[:]) // actually == it converts byte slice to string
	filesArray := strings.Split(files2, "\n")

	for _, f := range filesArray {
		fmt.Println("shazam: ", f) // remove shazam ! this is only to demonstrate that it is iterable
	}
}

如果我有遗漏的地方,请告诉我。

在Go语言中,将字节切片([]byte)转换为字符串后,直接遍历字符串会得到每个字符的索引,而不是按行分割的文件名。这是因为string(files[:])将整个字节切片转换为一个多行字符串,而for循环遍历字符串时是按Unicode字符迭代的。

要正确输出每个文件名,需要先将字节切片按行分割,然后遍历每行。以下是修改后的代码示例:

package main

import (
	"fmt"
	"os/exec"
	"strings"
)

func main() {
	var dir1 = "/dir/dir1"
	files, err := exec.Command("ls", dir1).Output()
	if err != nil {
		fmt.Println("Issue finding files: ", err)
		return
	}

	// 将字节切片转换为字符串并按行分割
	fileList := strings.Split(string(files), "\n")
	
	// 遍历每行并输出文件名
	for _, fileName := range fileList {
		if fileName != "" { // 过滤空行
			fmt.Println(fileName)
		}
	}
}

或者,也可以使用bytes包来处理字节切片,避免转换为字符串后再分割:

package main

import (
	"bytes"
	"fmt"
	"os/exec"
)

func main() {
	var dir1 = "/dir/dir1"
	files, err := exec.Command("ls", dir1).Output()
	if err != nil {
		fmt.Println("Issue finding files: ", err)
		return
	}

	// 按行分割字节切片
	fileList := bytes.Split(files, []byte("\n"))
	
	// 遍历每行并转换为字符串输出
	for _, fileNameBytes := range fileList {
		if len(fileNameBytes) > 0 { // 过滤空行
			fmt.Println(string(fileNameBytes))
		}
	}
}

需要注意的是,使用ls命令获取文件列表在跨平台场景下可能不够可靠。在Go中,更推荐使用osfilepath包来遍历目录:

package main

import (
	"fmt"
	"os"
	"path/filepath"
)

func main() {
	var dir1 = "/dir/dir1"
	
	entries, err := os.ReadDir(dir1)
	if err != nil {
		fmt.Println("Issue finding files: ", err)
		return
	}

	for _, entry := range entries {
		fmt.Println(entry.Name())
	}
}

这种方法更符合Go语言的惯用法,且具有更好的跨平台兼容性。

回到顶部