2016-10-06 5 views
1

https://play.golang.org/p/qxhocI6mjY«не поддерживает индексирование»: обеспечивает индексирование с помощью интерфейса?

В этой игре, я получаю эту ошибку: invalid operation: s[0] (type AlmostSlice does not support indexing) Так что мне интересно, можно ли осуществить индексацию?

Учитывая-структуру, как это:

type AlmostSlice struct { 
    Entities []string 
    Id  string 
    Stuffs string 
} 

Можно ли сделать поддержку индексации?

s := AlmostSlice{Id: "bar", Entities: []string{"foo"}} 
... := s[0] 
s[0] = "stuffs" 

Например, путем реализации что-то вроде этого:

func (s *AlmostSlice) Index(i int) string { 
    return s.Entities[i] 
} 
+3

№ из [spec] (https://golang.org/ref/spec#Index_expressions): выражение индекса обозначает «элемент массива, указатель на массив, срез, строку или карту», – JimB

ответ

1

Хороший вопрос. На других языках есть волшебные интерфейсы, которые вы можете реализовать, чтобы делать такие вещи, но в том смысле, что мы не имеем таких вещей. Поэтому, чтобы ответить на ваш вопрос, нет, начиная с 1.7, вы не можете реализовать индексацию в структуре.

1

Вы не можете. Go стремится быть простым и делать то, что сказано, а не вызывать базовые методы. Если он поддерживает индексирование, то это срез/массив, строка или карта. Таким образом, вы можете сделать this, хотя это, вероятно, не то, что вы хотите.

По этой причине, я бы порекомендовал вам просто делать то, что вы предложили в вашем вопросе, который должен иметь метод, который выбирает элемент из субъектов:

func (s AlmostSlice) Get(i int) string { 
    return s.Entities[i] 
} 

То есть, насколько как я знаю, лучший способ пойти в настоящее время.

Смежные вопросы