Golang中如何创建字符串切片

Golang中如何创建字符串切片 创建一个字符串切片的切片([][]string)。将以下数据存储在多维切片中:

"James", "Bond", "Shaken, not stirred"
"Miss", "Moneypenny", "Helloooooo, James."

遍历所有记录,然后遍历每条记录中的数据。

⭐ 这是一个实践练习的说明。

经过这里人们的帮助后,这是我的解决方案:

https://play.golang.org/p/FkXq0dfL1jb

这是老师的解决方案:

https://play.golang.org/p/A0-wVdlliHx

请解释两者之间的区别。


更多关于Golang中如何创建字符串切片的实战教程也可以访问 https://www.itying.com/category-94-b0.html

21 回复

谢谢你的赞美

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


什么是格式化按钮?

val和v之间有区别吗?

早上学习Go语言比喝咖啡更能让我清醒,这让我非常喜欢!

你很敏锐。id是什么?

谢谢。我明白你是对的

非常好。你取得了很大进展。使用格式按钮来获得正确的格式,例如将花括号放在正确的位置。

另外,老师使用了xs1、xs2和xxs。你认为他这样做可能有什么原因吗?

有趣。你建议的"v"代表什么含义?

你说得对!是什么让你想到用v而不是rt?

我尝试了那个格式按钮!真的很酷!我必须非常仔细地研究其中的差异

jayts: 最好使用能体现用途的变量名,这样能让代码更易于理解。

有意思。针对这种情况你有什么建议吗?

快速浏览手机时,我只能看出你的解决方案缺少格式规范以及语句顺序有所不同。

不过可能我遗漏了一些细节,因为现在我只用手机查看。

这是 Go Playground 中"分享"按钮旁边的按钮。它会改变程序的格式化方式,使其遵循 Go 程序通常的格式化规范。比如这里应该有多少空格等等。

你说得对。Todd McLeod。 关于第二个说法你也说对了。我不理解 fmt.Println(“record”, i, v) 和 fmt.Println("record: ", i) 之间的区别。

fmt.Println("record", i, v)
fmt.Println("record: ", i)

我没有看出这段代码有什么不同。这是来自Tood McLeod的课程,对吧?

一个区别在于for循环内部。你打印的是记录ID和值:

fmt.Println("record", i, v)

而老师只打印记录ID:

fmt.Println("record: ", i)

嗨 Cherolyn,

你做得非常好!看起来只是有一个小问题。

除了 Johan 指出的内容之外,还有这个:

for j, val := range rt {

与这个有所不同:

for j, val := range xs {

请注意这里是 xs,而不是 xxs。所以结果不同。你的版本只打印每个切片中的三个字符串中的两个。将代码中的 rt 改为 v,它就会打印全部三个。

cherilexvold1974:

val 和 v 有区别吗?

嗨 Cherolyn,

这是你在 Go Playground 上的程序,包含我建议的修改:

Go Playground - Go 编程语言

查看第二个 for 循环。我将 range rt 改为 range v,使其更接近老师的解决方案。尝试运行它。现在它会打印两个切片中的全部三个字符串。

cherilexvold1974:

另外,老师使用了xs1、xs2和xxs。你觉得他这么做有什么原因吗?

这些只是变量名,所以你可以使用任何你想要的名称。他选择的这些名称描述性不强!最好使用能帮助显示变量用途的名称,这样能让你的代码更易于理解。

// 代码示例
func main() {
    xs1 := []int{1, 2, 3}
    xxs := "示例字符串"
    fmt.Println(xs1, xxs)
}

在Golang中,你的解决方案和老师的解决方案在实现多维字符串切片时存在一些关键差异。以下是详细分析:

你的解决方案

package main

import "fmt"

func main() {
    xs1 := []string{"James", "Bond", "Shaken, not stirred"}
    xs2 := []string{"Miss", "Moneypenny", "Helloooooo, James."}
    fmt.Println(xs1)
    fmt.Println(xs2)

    xxs := [][]string{xs1, xs2}
    fmt.Println(xxs)

    for i, xs := range xxs {
        fmt.Println("record: ", i)
        for j, val := range xs {
            fmt.Printf("\t index position: %v \t value: \t %v \n", j, val)
        }
    }
}

老师的解决方案

package main

import "fmt"

func main() {
    xxs := [][]string{
        []string{"James", "Bond", "Shaken, not stirred"},
        []string{"Miss", "Moneypenny", "Helloooooo, James."},
    }
    
    for i, xs := range xxs {
        fmt.Println("record: ", i)
        for j, val := range xs {
            fmt.Printf("\t index position: %v \t value: \t %v \n", j, val)
        }
    }
}

主要区别

  1. 初始化方式不同

    • 你的方案:先创建单个切片,再组合成多维切片
    • 老师的方案:直接初始化多维切片
  2. 代码简洁性

    • 老师的方案更紧凑,减少了中间变量
    • 你的方案分步骤更清晰,便于调试
  3. 内存分配

    • 两种方式在性能上没有显著差异
    • 老师的方案在编译时完成所有初始化
  4. 输出内容

    • 你的方案包含了额外的调试输出(fmt.Println(xs1)等)
    • 老师的方案专注于核心逻辑

两种方案都是正确的,老师的方案更符合Go语言的简洁风格,而你的方案在学习和调试过程中更有优势。在实际项目中,推荐使用老师的简洁写法。

回到顶部