2016-09-11 19 views
0

動作しない私はAPIからgzip圧縮された応答を受信したクライアント上でこのコードを持っていました:、int64型から文字列への変換、その後スライスは

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:]) 

このコードは示しています enter image description here

しかし、私は[5:]を直接cadenitaで使用すると、それも文字列ですが、このエラーがあります。

enter image description here

私はスライスし、文字列に変換したトークン(int64型)への正規表現することができるようにしたいです。どうすればいいですか?

+1

ランタイムエラーは、[5:]の使用によるものです。これは、インデックス5の文字を文字列の最後に置きたいという意味です。しかし、トークンに少なくとも6桁(100 000など)が含まれるようになりましたか? – jnmoal

+0

文字列が5文字未満です。インデックスに入れる前に確認してください – JimB

+0

@ Jean-NicolasMoalはい、少なくとも6桁です。私の投稿を更新しました – Juanse

答えて

2

io.Copyはコピーされたバイト数を返します。つまり、あなたのトークン変数の値です。したがって、例の場合は40の領域になります。 FormatIntはそれを2文字しか持たない文字列 "40"に変換するので、 "5"の文字5で始まる部分文字列を尋ねるとエラーになります。

トークンで実際の応答データを取得しようとしていますか?そうであれば、それをバッファにコピーする必要があります。

buff := bytes.Buffer{} 
_, err := io.Copy(&buff, reader) 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Println(buff.String()[5:]) 
+0

io.Copyが咬傷の数を返した場合、私の例ではcadenitaが数字ではなく文字列をどのように表示していますか? – Juanse

+1

stdOutへの応答をコピーするので、出力がCopy呼び出しからのもので、行の最後の35はトークンが使用されないので、 "token"値 – superfell

+0

からであり、その行は_、errで置き換えられます。 = io.Copy(&buff、reader) – Juanse

関連する問題