2013-04-13 4 views
4

Предполагая, что у меня есть переменная int64 (или другой целочисленный размер), представляющая действительную кодовую точку юникода, и я хочу преобразовать ее в руну в Go, что мне делать?Вставить/преобразовать int в rune в Go

В C я бы использовал произнесение что-то типа, как:

c = (char) i; // 7 bit ascii only 

Но в Go, типа утверждение не будет работать:

c, err = rune.(i) 

предложение?

ответ

11

Вы просто хотите rune(i). Литье осуществляется через type(x).

Тип утверждения - это нечто иное. Вы используете утверждение типа, когда вам нужно перейти от менее определенного типа (например, interface{}) к более конкретному. Кроме того, во время компиляции проверяется приведение, где утверждения типа выполняются во время выполнения.

Вот как вы используете тип утверждение:

var (
    x interface{} 
    y int 
    z string 
) 
x = 3 

// x is now essentially boxed. Its type is interface{}, but it contains an int. 
// This is somewhat analogous to the Object type in other languages 
// (though not exactly). 

y = x.(int) // succeeds 
z = x.(string) // compiles, but fails at runtime 
+0

D'oh! Это отлично работает: используйте имя типа в том, что выглядит как вызов функции для трансляции. Каким-то образом, набирая учебник, я нашел довольно много о утверждениях типа, но немного о кастинге. – Roboprog

+0

Забавно, я использовал утверждения типа так, как java-экземпляр, но, как я уже сказал, еще не пробежал простой показ. Спасибо за помощь! – Roboprog

2

В Go, вы хотите, чтобы выполнить преобразование.

Conversions

преобразования выражения вида T(x), где T является тип и x это выражение, которое может быть преобразовано в тип T.

Conversion = Type "(" Expression ")" . 

Непостоянный значение x может быть преобразован в тип T в любом из этих случаев :

  • x отнесено к T.
  • x тип и T имеют одинаковые базовые типы.
  • x тип и T являются неназванными типами указателей, а их базовые типы указателей имеют одинаковые базовые типы.
  • x тип и T являются целыми или с плавающей точкой.
  • x тип и T являются сложными типами.
  • x является целым числом или имеет тип []byte или []rune и T - это строковый тип.
  • x является нитью и T является []byte или []rune.

Вы хотите преобразовать x, типа int, int32 или int64, чтобы T типа rune, псевдоним для типа int32.x и T являются целыми.

Таким образом, T(x) разрешено и написано rune(x), для вашего примера, c = rune(i).

+0

Тег [tag: casting] определяет кастинг как «процесс, когда тип объекта явно преобразован в другой тип, если разрешено преобразование». «Кастинг» не будет языковым агностическим словом для того, что Go называет «конверсиями»? Я думаю, что есть смысл оставить тег в вопросе, если не будет более сильной разницы в значении, чем я понимаю. (В этом случае мне бы хотелось получить разъяснения.) –

+0

Конверсии и ролики разные. Go делает конверсии, а не отбрасывает. Описание тегов переполнения стека очень далеки от авторитетных. – peterSO

+1

Гугл, я все еще очень тяжело обнаруживаю, есть ли разница. Я нахожу много вещей, таких как «Кастинг представляет собой запрос программиста сделать явное преобразование типов». Вот как я думаю о кастинге, и я думаю, что так думает типичный программист. Просьба уточнить важное различие, или добавим тег назад, чтобы облегчить людям поиск этого вопроса (и вашего полезного ответа), когда (вполне понятно, насколько мне известно) в поисках «[go] [casting ] '' или аналогичный. –

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

  • Нет связанных вопросов^_^