2016-09-11 9 views
0

작동하지 않습니다Golang에서, 변환 INT64에서 문자열로 다음 조각은 내가 API에서 gzip으로 압축 된 응답을받는 클라이언트에서이 코드가했습니다

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

그러나 cadenita에서 [5 :]를 직접 사용하면 문자열이기는하지만이 오류가 발생합니다.

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는 그 문자를 "40"의 char 5에서 시작하는 부분 문자열을 요구할 때 알 수있는 것처럼 2 개의 문자 만있는 "40"문자열로 변환합니다.

토큰에서 실제 응답 데이터를 가져 오시겠습니까? 그렇다면 버퍼에 복사해야합니다.

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