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 に答える