1

我本来希望这段代码可以工作:

package main

type Item struct {
  Key string
  Value string
}

type Blah struct {
  Values []Item
}

func main() {
  var list = [...]Item {
    Item {
      Key : "Hello1",
      Value : "World1",
    },
    Item {
      Key : "Hello1",
      Value : "World1",
    },
  }

  _ = Blah {
    Values : &list,
  }
}

我认为这是正确的做法;值是一个切片,列表是一个数组。&list 应该是一个切片,可以分配给 Item[],对吧?

...但是相反,它会出现以下消息错误:

cannot use &list (type *[2]Item) as type []Item in assignment

在 C 中,你会写:

struct Item {
  char *key;
  char *value;
};

struct Blah {
   struct Item *values;
};

你如何在 Go 中做到这一点?

我看到了这个问题: 使用指向数组的指针

...但是答案要么是针对 Go 的先前版本,要么就是完全错误的。:/

4

3 回答 3

4

切片不仅仅是指向数组的指针,它具有包含其长度和容量的内部表示。

如果你想从中分一杯羹,list你可以这样做:

_ = Blah {
    Values : list[:],
}
于 2013-02-11T04:38:29.777 回答
3

幸运的是,Go 并不像 OP 中看起来那么冗长。这有效:

package main

type Item struct {
        Key, Value string
}

type Blah struct {
        Values []Item
}

func main() {
        list := []Item{
                {"Hello1", "World1"},
                {"Hello2", "World2"},
        }

        _ = Blah{list[:]}
}

(也在这里

PS:让我建议不要在 Go 中编写 C。

于 2013-02-11T07:08:35.867 回答
2

当你开始使用 Go 时,完全忽略数组而只使用切片是我的建议。数组很少使用,给 Go 初学者带来很多麻烦。如果你有一个切片,那么你不需要指向它的指针,因为它是一个引用类型。

这是您的示例,其中包含切片且没有指针,这更加惯用。

package main

type Item struct {
    Key   string
    Value string
}

type Blah struct {
    Values []Item
}

func main() {
    var list = []Item{
        Item{
            Key:   "Hello1",
            Value: "World1",
        },
        Item{
            Key:   "Hello1",
            Value: "World1",
        },
    }

    _ = Blah{
        Values: list,
    }
}
于 2013-02-11T20:46:05.653 回答