¿Cómo convertir un valor int a string en Go?

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

s es 'E', pero lo que quiero es "123"

Por favor, dime cómo puedo obtener "123".

Y en Java, puedo hacer de esta manera:

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

¿Cómo puedo concatdos cadenas en Go?

hardPass
fuente
La segunda pregunta (concatenación de cadenas) tiene una respuesta en otra parte que cubre la eficiencia.
RedGrittyBrick

Respuestas:

772

Usa el strconvpaqueteItoa función .

Por ejemplo:

package main

import (
    "strconv"
    "fmt"
)

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

Puede concatenar cadenas simplemente ingiriéndolas +o utilizando la Joinfunción del stringspaquete.

Klaus Byskov Pedersen
fuente
97
¿Por qué los diseñadores de lenguaje pensaron que los nombres de funciones crípticas como "Itoa" eran preferibles a algo que podría ser un poco más descriptivo?
Lucas
25
@luke proviene del patrimonio C, donde toda la máquina podría tener 256K de memoria; la facilidad de uso se sacrificó para adaptarse a una mayor funcionalidad. Los creadores de Go están profundamente arraigados en esa herencia y se sienten completamente cómodos con estos nombres.
Bryan
117
Poner la historia por encima de la accesibilidad y la facilidad de aprendizaje es un mal diseño IMO. :(
Lucas
32
@Luke Depende de quiénes son sus usuarios objetivo y qué tan fuerte es la convención. Algunas interfaces de usuario todavía tienen un disquete como icono Guardar :)
Nathron
65
para recordar fácilmente el nombre ItoA - Entero para ASCII
Ivan Aracki
139
fmt.Sprintf("%v",value);

Si conoce el tipo específico de valor, utilice el formateador correspondiente, por ejemplo, %dparaint

Más información - fmt

Jasmeet Singh
fuente
%dpara int - this
scniro
44
No recomendaría esto, ya que es mucho menos eficiente que otros métodos de conversión porque usa la reflexión.
Ricardo Souza
49

Es interesante notar que strconv.Itoaes una forma abreviada de

func FormatInt(i int64, base int) string

con base 10

Por ejemplo:

strconv.Itoa(123)

es equivalente a

strconv.FormatInt(int64(123), 10)
kgthegreat
fuente
undefined: strconv in strconv.Itoa
Felo Vilches
1
@FeloVilches importa "strconv"
kgthegreat
3
Es interesante notar que llamar a FormatInt () directamente en lugar de Itoa () ahorra 0.1 nanosegundos según el punto de referencia en stackoverflow.com/a/38077508/968244
isapir
43

fmt.Sprintf, strconv.Itoay strconv.FormatIntharemos el trabajo. Pero Sprintfusará el paquete reflect, y asignará un objeto más, por lo que no es una opción eficiente.

ingrese la descripción de la imagen aquí

Bryce
fuente
22

En este caso tanto strconvy fmt.Sprintfhacer el mismo trabajo, pero utilizando el strconvdel paquete de Itoafunción es la mejor opción, ya que fmt.Sprintfasignar un objeto más durante la conversión.

comprobar el resultado de ambos puntos de referencia consulte el punto de referencia aquí: https://gist.github.com/evalphobia/caee1602969a640a4530

ver https://play.golang.org/p/hlaz_rMa0D por ejemplo.

Manigandand
fuente
1
@Boon ¿Tiene un impacto visible en su aplicación? Como siempre, depende. Otro objeto significa que un objeto más, más allá del obvio golpe temporal de memoria pequeña, necesita ser recolectado como basura. Si está llamando a la función a altas velocidades, por ejemplo, como parte de algún proceso de serialización utilizado cada vez que se recibe un mensaje desde algún lugar, podría tener un impacto significativo. Desde fmt.Sprintfy strconv.iotason similares en términos de facilidad de uso y muestran los datos anteriores iota a ser más rápido con menor impacto GC, parece que iotase debe utilizar, en general, cuando un solo número entero necesidades de conversión.
Edward
Me parece una optimización prematura pensar en este nivel tan pronto. Lo mejor es escribir primero el código legible.
Boon
@Boon Son igualmente legibles. También podría usar el más rápido. Además, ¿qué decir que un nuevo programador de Golang no está comenzando con algo que haga muchas de estas conversiones? Soy un programador experimentado escribiendo mi primer código de Golang en este momento y estoy en esa situación.
sudo
9

Convertir int64:

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

fmt.Println(str)
// Prints "32"
Cae Vecchi
fuente
3

ok, la mayoría de ellos te han mostrado algo bueno. Déjame darte esto:

// 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 ""
    }
}
fwhez
fuente
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)
}
Sagiruddin Mondal
fuente