итерация + приведение в движение - PullRequest
3 голосов
/ 16 июля 2010

у меня есть этот фрагмент кода, который использует итератор в списке

for x:= range s.faces.Iter(){
    x.Render()
}

в качестве точек компилятора, x имеет тип интерфейса {} и нет метода (интерфейса i) Render () определено в моем коде.

меняется на

for x:= range s.faces.Iter(){
    x.(faceTri).Render()
}

compile, потому что есть метод func (f faceTri) Render (), но при выполнении возникает ошибка времени выполнения:

паника: преобразование интерфейса: интерфейс - это * geometry.faceTri, а не geometry.faceTri

(геометрия - это пакет)

поэтому любой может указать мне ресурс, который объясняетспособ использовать итераторы + приведение?

1 Ответ

3 голосов
/ 16 июля 2010

Это на самом деле называется утверждением типа в go, а не приведением (приведением является преобразование времени компиляции между определенным совместимым типом, т. Е. Int -> int32).

Исходя из опубликованной вами ошибки, у вас просто естьмаленькая ошибка в вашем коде.Базовым типом x является *faceTri (указатель на структуру faceTri), поэтому утверждение типа должно быть x.(*faceTri)

РЕДАКТИРОВАТЬ:

Несколько вещей, чтобы уточнить и перейтивне вашего вопросаУтверждение типа в go не является приведением, например: interface_with_underlying_type_int.(int64) будет паниковать, даже если int можно привести к int64

Также вы можете проверить утверждение типа, используя запятую-okидиома

not_interface, ok := some_interface.(some_type)

ok - это логическое значение, указывающее, было ли преобразование успешным, вместо того, чтобы вызывать панику во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...