Go 语言中的结构

标签 struct go

我刚开始学习 GoLang,我正在看他们的教程之一 (https://golang.org/doc/code.html)。

在他们的一个示例中,他们将变量设置为结构,但我很困惑他们如何在下面的 for 循环中访问结构的元素?有人可以澄清的机会吗?非常感谢!

代码:

package stringutil

import "testing"

func TestReverse(t *testing.T) {
    cases := []struct {
        in, want string
    }{
        {"Hello, world", "dlrow ,olleH"},
        {"Hello, 世界", "界世 ,olleH"},
        {"", ""},
    }
    for _, c := range cases {
        got := Reverse(c.in)
        if got != c.want {
            t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
        }
    }
}

最佳答案

下面是带有一些注释的代码,以帮助阐明每个语句在其中的作用。

import "testing"

func TestReverse(t *testing.T) {
    cases := []struct { // declaration of anonymous type
        in, want string // fields on that type called in and want, both strings
    }{
        {"Hello, world", "dlrow ,olleH"},
        {"Hello, 世界", "界世 ,olleH"},
        {"", ""},
    } // composite literal initilization
    // note the use of := in assigning to cases, that op combines declaration and assignment into one statement
    for _, c := range cases { // range over cases, ignoring the index - the underscore means to discard that return value
        got := Reverse(c.in) // c is the current instance, access in with the familiar dot notation
        if got != c.want { // again, access operator on c, the current instance
            t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want) // more access
        }
    }
}

如果有帮助,请告诉我。如果某些陈述仍然没有意义,我可以尝试提供更多的口头摘要或添加更多细节。此外,如果您不熟悉集合的范围“范围”,请引用,返回 k, v 其中 k 是索引或键,v 值(value)。

编辑:关于cases

声明/初始化的细节
    cases := []struct {
        in, want string
    }

第一对大括号内的这一点是结构的定义。这是一个匿名类型,一个普通的声明看起来像这样;

    type case struct {
        in string
        want string
    }

如果你有这样的东西,那么在这个包的范围内会有一个名为 case 的类型(不导出,如果你想让它“公开”,那么它需要是 键入 Case 代替)。相反,示例结构是匿名的。它与普通类型一样工作,但是作为开发人员,您将无法引用该类型,因此您实际上只能使用此处初始化的集合。在内部,此类型与任何其他具有 2 个未导出字段字符串的结构相同。这些字段被命名为 inwant。请注意,在此处的赋值 cases := []struct 中,您在 struct 之前有 [] 这意味着您要声明此匿名的一部分类型。

下一点,称为静态初始化。这是将集合初始化为类型的语法。这些嵌套位(如 {"", ""})中的每一个都是这些匿名结构之一的声明和初始化,再次由花括号表示。在这种情况下,您分别将两个空字符串分配给 inwant(如果您不使用名称,则顺序与定义中的顺序相同)。外面一对大括号用于 slice 。如果你的 slice 是 int 或 string,那么你将只拥有值,而无需像 myInts := []int{5,6,7} 这样的额外嵌套级别。

    {
        {"Hello, world", "dlrow ,olleH"},
        {"Hello, 世界", "界世 ,olleH"},
        {"", ""},
    }

关于Go 语言中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34362649/

相关文章:

go - 检索后无法将数据插入数据库

loops - Golang 重新 slice 问题

c - 使用 libconfig.h 的字符串和字符集问题

sql-server - 为什么括号访问表示法有效但点不起作用?

c - 指向节点指针数组的指针

go - 为什么我可以在 go 中重新声明一个 const?

compiler-construction - 在 Windows 中编译 Go 文件?

c - 两个结构变量在 union 内获得相同的值

c - C中的结构内存布局

go - 如何在 Golang 中修复 ‘net/http set header ORIGIN’