2012-12-19 12 views
9

У меня есть некоторые детали в моем текущем коде Go, которые выглядят следующим образом:Избегайте слишком много преобразования

i := int(math.Floor(float64(len(l)/4))) 

многословие представляется необходимым из-за некоторые подписи типа функции, как в math.Floor, но это может быть упрощено?

ответ

13

В общем, строгая типизация Go приводит к некоторым подробным выражениям. Тем не менее, словосочетание не означает заикания. Преобразования типов полезны, и важно, чтобы эти полезные вещи были явно указаны.

Уловка для упрощения заключается в том, чтобы не писать ненужные преобразования типов, и для этого вам нужно обратиться к документации, такой как определение языка.

В вашем конкретном случае вам нужно знать, что len() возвращает int и, далее, значение> = 0. Вам нужно знать, что 4 - это константа, которая примет тип int в этом выражении, и вам нужно знать, что целочисленное деление вернет целочисленное частное, которое в этом случае будет неотрицательным int, и на самом деле именно тот ответ, который вы хотите.

i := len(l)/4 

Этот случай прост.

+0

Да, спасибо за ваш ответ. Это простой пример, но он раздражает выражениями типа «math.Max», например. – GiantSquid

+0

«Вам нужно знать, что 4 - это константа, которая примет тип int в этом выражении». Мне интересно, откуда вы это знаете, потому что константы не имеют определенного типа? – kristianp

2

Я не уверен на 100%, как Go работает с целым делением и целым преобразованием, но обычно это происходит путем усечения. Таким образом, при условии, LEN (л) является INT

i:=len(l)/4 

В противном случае i:= int(len(l))/4 или i:=int(len(l)/4) должен работать, при этом первый из которых теоретически немного быстрее, чем второй.

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