В Golang преобразование из int64 в строку, а затем в срез не работает.

У меня есть этот код на клиенте, который получает сжатый ответ от API:

client := &http.Client{}
response, _ := client.Do(r)

// Check that the server actual sent compressed data
var reader io.ReadCloser
switch response.Header.Get("Content-Encoding") {
case "gzip":
    reader, err := gzip.NewReader(response.Body)
    if err != nil {
        log.Fatal(err)
    }
    defer reader.Close()
default:
    reader = response.Body
}

token, err := io.Copy(os.Stdout, reader)
if err != nil {
    log.Fatal(err)
}

cadenita := strconv.FormatInt(token, 10)

fmt.Println(cadenita)

cadena := "code=b2cc1793-cb7a-ea8d-3c82-766557"
fmt.Println(cadena[5:])

Этот код показывает: введите здесь описание изображения

Но, если я использую [5:] непосредственно в кадените, хотя это тоже строка, у меня возникает эта ошибка.

введите здесь описание изображения

Я хочу иметь возможность нарезать и регулярно использовать токен (int64), преобразованный в строку. Как я могу это сделать?


person Juanse    schedule 11.09.2016    source источник
comment
ошибка времени выполнения связана с использованием [5:]. это означает, что я хочу, чтобы символ от индекса 5 до конца строки. Но как быть теперь, когда ваш токен содержит как минимум 6 цифр (например, 100 000)?   -  person jnmoal    schedule 11.09.2016
comment
Ваша строка содержит менее 5 символов. Подтвердите это, прежде чем индексировать его   -  person JimB    schedule 11.09.2016
comment
@ Jean-NicolasMoal Да, в нем не менее 6 цифр. я только что обновил свой пост   -  person Juanse    schedule 11.09.2016


Ответы (1)


io.Copy возвращает количество скопированных байтов, так что это значение находится в вашей переменной токена, то есть где-то в районе 40 для вашего примера. FormatInt преобразует это в строку «40», которая имеет только 2 символа, поэтому будет ошибка, как вы видите, когда вы запросите подстроку, начинающуюся с символа 5 из «40».

Вы пытаетесь получить фактические данные ответа в токене? если это так, вам нужно скопировать его в буфер, например.

buff := bytes.Buffer{}
_, err := io.Copy(&buff, reader)
if err != nil {
    log.Fatal(err)
}
fmt.Println(buff.String()[5:])
person superfell    schedule 11.09.2016
comment
если io.Copy возвращает количество битов, то почему в моем примере cadenita показывает строку, а не число? - person Juanse; 11.09.2016
comment
поскольку вы копируете ответ в stdOut, вывод происходит из вызова Copy, 35 в конце строки — из значения токена - person superfell; 11.09.2016
comment
поскольку токен не будет использоваться, эту строку можно заменить на _, err := io.Copy(&buff, reader) - person Juanse; 11.09.2016