dro62273 2015-12-18 19:29
浏览 13
已采纳

GoLang中的结构

I am just starting with GoLang, and I am looking at one of their tutorials (https://golang.org/doc/code.html).

In one of their examples, they set a variable to a struct, but I am so confused as to how they are accessing elements of the struct in the for loop below? Any chance someone can clarify? Thanks alot!

Code:

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)
        }
    }
}
  • 写回答

2条回答 默认 最新

  • doutouman6245 2015-12-18 19:33
    关注

    Below is the code with some comments to help clarify each statements role in this.

    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
            }
        }
    }
    

    Let me know if that helps. I can try giving more of a summary in spoken language or add more details if some of the statements don't make sense still. Also, fyi if you're not familiar range 'ranges' over a collection, returning k, v where k is the index or key and v the value.

    EDIT: details on the declaration/initilization of cases

        cases := []struct {
            in, want string
        }
    

    This bit inside the first pair of curly braces is the definition of a struct. This is an anonymous type, a normal declaration would look like this;

        type case strcut {
            in string
            want string
        }
    

    If you had something like this then there would be a type called case in the scope of this package (not exported, if you wanted to make it 'public' so it would need to be type Case instead). Instead the examples struct is anonymous. It works the same as normal type, however as a developer, you will have no way to reference that type so you can only practically work with the collection initialized here. Internally this type is the same as any other struct with 2 unexported strings for fields. The fields are named in and want. Notice that in the assignment here cases := []struct you have [] before struct this means you're declaring a slice of this anonymous type.

    This next little bit, is called static initilization. This is a syntax for initializing collections an types. Each of these nested bits like {"", ""} is the declaration and initilization of one of these anonymous structs, denoted again by the curly braces. In this case you're assigning two empty strings to in and want respectively (if you don't use names, the order is the same as in the definition). The outer pair of braces is for the slice. If your slice were of say ints or strings, then you would just have the values right there without the extra level of nesting like myInts := []int{5,6,7}.

        {
            {"Hello, world", "dlrow ,olleH"},
            {"Hello, 世界", "界世 ,olleH"},
            {"", ""},
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 mmocr的训练错误,结果全为0
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀