2016-10-25 7 views
4

私はこのように、ポインタのスライスを初期化することができ驚いた:どのように私はこれのようなポインタのスライスを初期化できますか?

package main 

import (
    "fmt" 
) 

type index struct { 
    i, j int 
} 

func main() { 
    indices := []*index{{0, 1}, {1, 3}} // Why does this work? 

    fmt.Println(*indices[1]) 
} 

私はより冗長のようなものを書かなければならないことを期待しました:

私はドキュメントでこれを見つけるだろう
indices := []*index{&index{0, 1}, &index{1, 3}} 

the specから

答えて

5

:それと同一である場合、配列、スライス、またはマップタイプTの複合リテラル内

、要素またはそれ自体である マップキー複合リテラルは 各リテラルタイプをElideのできますエレメントまたはキータイプがTである場合、 のT.同様に、複合語 リテラルのアドレスであるエレメントまたはキーは、& Tを排除することがあります。

基本的には、すでに各要素が*indexになります知っているので、それはあなたが実際に何度も何度も&indexを入力する手間が省けます。

スライスタイプは、要素型(おそらくそれは、インターフェイスタイプのスライスである)と同じでない場合、あなたはそのような各要素の型を指定する必要があります:

indices := []interface{}{&index{0, 1}, &index{1, 3}}

+0

感謝。配列やスライス、マップのコンテキストで型を削除することはできますが、構造体や変数には型を削除することは面白いことです。 – user3467895

+0

ええ、 'var i * index = {1,3}'が有効であることはほとんど意味がありますが、そうではありません。しかし、 'i:=&index {1,3} 'を使うのと同じくらい簡単です。 – captncraig

関連する問題