为了账号安全,请及时绑定邮箱和手机立即绑定

GoLang 中的结构

GoLang 中的结构

Go
四季花海 2021-11-29 16:42:15
我刚开始使用 GoLang,我正在查看他们的教程之一 ( https://golang.org/doc/code.html )。在他们的一个例子中,他们将一个变量设置为一个结构,但我很困惑他们如何在下面的 for 循环中访问结构的元素?有人可以澄清一下吗?非常感谢!代码:package stringutilimport "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)        }    }}
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

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


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值。


编辑:有关声明/初始化的详细信息 cases


    cases := []struct {

        in, want string

    }

第一对花括号内的这一位是结构的定义。这是一个匿名类型,正常的声明应该是这样的;


    type case struct {

        in string

        want string

    }

如果你有这样的东西,那么case在这个包的范围内会有一个类型被调用(不导出,如果你想把它设为“公共”,所以它需要type Case改为)。相反,示例结构是匿名的。它的工作方式与普通类型相同,但是作为开发人员,您将无法引用该类型,因此您实际上只能使用此处初始化的集合。在内部,此类型与具有 2 个未导出的字段字符串的任何其他结构相同。这些字段被命名为in和want。请注意,在这里分配cases := []struct你[]面前struct,这意味着你正在声明该匿名类型片。


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


    {

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

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

        {"", ""},

    }


查看完整回答
反对 回复 2021-11-29
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

什么是结构的根。


你在其中声明你的变量,这样你就可以从函数中使用它。例子:


package main


import (

    "fmt"


)


func main() {

    Get()


}


func Get(){

    out := new(Var)


    out.name = "james"


    fmt.Println(out.name)

}

type Var struct {

    name string

}


查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信