2016-09-28 2 views
-1

На ходе игровой площадки, этот кодПочему элементы байтовых кусочков возвращаются как Ints in Go?

package main 

import (
    "fmt" 
) 

var a = []byte{ 0xff, 0xaa, 0x66, 0x33, 0x00 } 

func main() { 
    for b := range a { 
     fmt.Printf("%T\n", b) 
    } 
} 

печатает

int 
int 
int 
int 
int 

Почему в мире не ломтик байт даст вам байты, когда вы перебирать его (или, по крайней мере uint8 или что-то)?

Вот ссылка на детскую площадку: https://play.golang.org/p/V1uZZWWq-X.

+0

Ой, подождите, потому что '[] byte' эквивалентен' string', и итерация через 'string' должна дать вам' rune'? Это смущает, почему бы не ограничить такое поведение типом 'string'? – cderwin

+7

Нет, 'for i: = range thing' устанавливает i в _indices_ в вещь (в отличие от Python или такого). 'для i, b: = range byteslice' помещает индекс в' i' и байт в 'b', а' for _, b: = range byteslice' просто поместил бы байт в 'b'. – twotwotwo

+0

О, черт возьми, я глуп, спасибо тонну. Если вы хотите ответить на этот вопрос, я буду отмечать его как правильное. – cderwin

ответ

4

for i := range thing устанавливает i в индексы в вещь (в отличие от Python или таких). for i, b := range byteslice поставил бы индекс в i и байт в b и for _, b := range byteslice просто поместил бы байт в b.

The spec on for statements выдает все различные особые случаи, связанные с выражениями range (включая строки, каналы и карты).

3

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

Чтобы быть ясным, если ваша форма петель; for i, v := range then i - это int, представляющий текущий индекс, а v - это блок временного хранения, которому присвоено значение с индексом i. Если вы хотите только значения, то ваш цикл будет; for _, v := range. Когда у вас есть только один идентификатор слева, ему присваивается индекс, а не значение.