Go에서 int 값을 문자열로 변환하는 방법은 무엇입니까?


486
i := 123
s := string(i) 

s는 'E'이지만 원하는 것은 "123"입니다.

어떻게 "123"을받을 수 있는지 알려주십시오.

그리고 Java에서는 다음과 같이 할 수 있습니다.

String s = "ab" + "c"  // s is "abc"

concatGo에서 두 줄을 어떻게 사용할 수 있습니까?


두 번째 질문 (문자열 연결)은 효율성을 다루는 다른 곳의 대답 이 있습니다.
RedGrittyBrick 15시 48 분

답변:


772

strconv패키지를 사용하십시오Itoa 기능을 .

예를 들면 다음과 같습니다.

package main

import (
    "strconv"
    "fmt"
)

func main() {
    t := strconv.Itoa(123)
    fmt.Println(t)
}

단순히 문자열을 연결 +하거나 패키지 의 Join기능을 사용하여 문자열을 연결할 수 있습니다 strings.


97
언어 설계자들이 "Itoa"와 같은 암호 함수 이름이 좀 더 설명하기 쉬운 것보다 선호되는 이유는 무엇입니까?
Luke

25
@luke는 전체 시스템에 256K 메모리가있을 수있는 C 유산에서 비롯된 것입니다. 더 많은 기능을 사용할 수 있도록 유용성이 희생되었습니다. Go 제작자는 모두 그 유산에 깊이 깊숙이 박혀 있으며 이러한 이름에 완전히 익숙해집니다.
Bryan

117
접근성 및 학습 용이성보다 역사를 두는 것은 나쁜 디자인 IMO입니다. :(
누가

32
@Luke 대상 사용자가 누구이며 규칙이 얼마나 강력한 지에 따라 다릅니다. 일부 UI에는 여전히 저장 아이콘으로 플로피 디스크가 있습니다.
Nathron

65
쉽게 기억하는 이름 ItoA - 정수 ASCII로
이반 Aracki

139
fmt.Sprintf("%v",value);

당신은 값의 특정 유형은 예를 들어 해당 포맷을 사용하여 알고있는 경우 %d에 대한int

더 많은 정보 -FMT


%dint-this
scniro

4
리플렉션을 사용하기 때문에 다른 변환 방법보다 훨씬 덜 효율적이므로 권장하지 않습니다.
Ricardo Souza


43

fmt.Sprintf, strconv.Itoa그리고 strconv.FormatInt일을 할 것입니다. 그러나 Sprintfpackage를 사용하고 reflect하나 이상의 객체를 할당하므로 효율적인 선택이 아닙니다.

여기에 이미지 설명을 입력하십시오



22

모두이 경우 strconvfmt.Sprintf같은 일을 할 수 있지만 사용하여 strconv패키지의 Itoa때문에 기능하는 것은 최선의 선택을 fmt.Sprintf변환하는 동안 하나 이상의 오브젝트를 할당합니다.

둘 다의 너치 마크 결과를 확인하십시오 여기에서 벤치 마크를 확인하십시오. https://gist.github.com/evalphobia/caee1602969a640a4530

예를 들어 https://play.golang.org/p/hlaz_rMa0D 를 참조 하십시오 .


1
@Boon 앱에 눈에 띄는 영향이 있습니까? 항상 그렇듯이-그것은 달려 있습니다. 또 다른 객체는 명백한 일시적인 작은 메모리 히트를 넘어서 하나 이상의 객체가 가비지 수집되어야 함을 의미합니다. 예를 들어 메시지를 다른 곳에서 수신 할 때마다 사용되는 일부 직렬화 프로세스의 일부로 높은 속도로 함수를 호출하는 경우 상당한 영향을 줄 수 있습니다. 이후 fmt.Sprintfstrconv.iota사용의 용이성 및 IOTA 빠르게 하부 GC에 영향을 될 수있는 상기 데이터 방송의 관점에서 유사하다, 그 표시가 iota하나의 정수로 변환해야 할 때 일반적으로 사용되어야한다.
Edward

이 수준에서 너무 빨리 생각하는 것은 조기 최적화와 같습니다. 가장 좋은 것은 먼저 읽을 수있는 코드를 작성하는 것입니다.
Boon

@Boon 그들은 똑같이 읽을 수 있습니다. 더 빠른 것을 사용할 수도 있습니다. 또한 새로운 Golang 프로그래머가 이러한 많은 전환을 수행하는 것으로 시작하지 않는다고 말하는 것은 무엇입니까? 나는 지금 첫 번째 Golang 코드를 작성하는 숙련 된 프로그래머이며 그 상황에 처해 있습니다.
sudo

9

전환 int64:

n := int64(32)
str := strconv.FormatInt(n, 10)

fmt.Println(str)
// Prints "32"

3

좋아, 그들 대부분은 당신에게 좋은 것을 보여주었습니다. 이것을 드리겠습니다 :

// ToString Change arg to string
func ToString(arg interface{}, timeFormat ...string) string {
    if len(timeFormat) > 1 {
        log.SetFlags(log.Llongfile | log.LstdFlags)
        log.Println(errors.New(fmt.Sprintf("timeFormat's length should be one")))
    }
    var tmp = reflect.Indirect(reflect.ValueOf(arg)).Interface()
    switch v := tmp.(type) {
    case int:
        return strconv.Itoa(v)
    case int8:
        return strconv.FormatInt(int64(v), 10)
    case int16:
        return strconv.FormatInt(int64(v), 10)
    case int32:
        return strconv.FormatInt(int64(v), 10)
    case int64:
        return strconv.FormatInt(v, 10)
    case string:
        return v
    case float32:
        return strconv.FormatFloat(float64(v), 'f', -1, 32)
    case float64:
        return strconv.FormatFloat(v, 'f', -1, 64)
    case time.Time:
        if len(timeFormat) == 1 {
            return v.Format(timeFormat[0])
        }
        return v.Format("2006-01-02 15:04:05")
    case jsoncrack.Time:
        if len(timeFormat) == 1 {
            return v.Time().Format(timeFormat[0])
        }
        return v.Time().Format("2006-01-02 15:04:05")
    case fmt.Stringer:
        return v.String()
    case reflect.Value:
        return ToString(v.Interface(), timeFormat...)
    default:
        return ""
    }
}

0
package main

import (
    "fmt" 
    "strconv"
)

func main(){
//First question: how to get int string?

    intValue := 123
    // keeping it in separate variable : 
    strValue := strconv.Itoa(intValue) 
    fmt.Println(strValue)

//Second question: how to concat two strings?

    firstStr := "ab"
    secondStr := "c"
    s := firstStr + secondStr
    fmt.Println(s)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.