Bagaimana cara mengkonversi nilai int ke string di Go?

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

s adalah 'E', tetapi yang saya inginkan adalah "123"

Tolong beritahu saya bagaimana saya bisa mendapatkan "123".

Dan di Jawa, saya bisa melakukannya dengan cara ini:

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

bagaimana saya bisa concatdua string di Go?

hardPass
sumber
Pertanyaan kedua (rangkaian string) memiliki jawaban di tempat lain yang mencakup efisiensi.
RedGrittyBrick

Jawaban:

772

Gunakan fungsi strconvpaket Itoa.

Sebagai contoh:

package main

import (
    "strconv"
    "fmt"
)

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

Anda dapat membuat string hanya dengan +memasukkannya, atau dengan menggunakan Joinfungsi stringspaket.

Klaus Byskov Pedersen
sumber
97
Mengapa perancang bahasa berpikir bahwa nama fungsi samar seperti "Itoa" lebih disukai daripada sesuatu yang mungkin sedikit lebih deskriptif?
Luke
25
@luke itu berasal dari warisan C di mana seluruh mesin mungkin memiliki 256 ribu memori; Kegunaan dikorbankan agar sesuai dengan lebih banyak fungsi masuk. Pencipta Go semua tertanam dalam warisan itu dan merasa sepenuhnya nyaman dengan nama-nama ini.
Bryan
117
Menempatkan sejarah di atas aksesibilitas dan kemudahan belajar adalah desain IMO yang buruk. :(
Luke
32
@ Lukas Tergantung pada siapa pengguna target Anda dan seberapa kuat konvensi itu. Beberapa UI masih memiliki floppy disk sebagai ikon Simpan :)
Nathron
65
untuk nama yang mudah diingat ItoA - Integer ke ASCII
Ivan Aracki
139
fmt.Sprintf("%v",value);

Jika Anda tahu jenis nilai spesifik gunakan formatter yang sesuai misalnya %duntukint

Info lebih lanjut - fmt

Jasmeet Singh
sumber
%duntuk int - ini
scniro
4
Saya tidak akan merekomendasikan ini, karena ini jauh lebih efisien daripada metode konversi lain karena menggunakan refleksi.
Ricardo Souza
49

Sangat menarik untuk dicatat bahwa strconv.Itoaadalah singkatan untuk

func FormatInt(i int64, base int) string

dengan basis 10

Sebagai contoh:

strconv.Itoa(123)

setara dengan

strconv.FormatInt(int64(123), 10)
kgbesar
sumber
undefined: strconv in strconv.Itoa
Felo Vilches
1
@FeloVilches impor "strconv"
kgthegreat
3
Menarik untuk dicatat bahwa memanggil FormatInt () secara langsung alih-alih Itoa () menghemat 0,1 nanosecond sesuai dengan tolok ukur di stackoverflow.com/a/38077508/968244
isapir
43

fmt.Sprintf, strconv.Itoadan strconv.FormatIntakan melakukan pekerjaan itu. Tetapi Sprintfakan menggunakan paket reflect, dan akan mengalokasikan satu objek lagi, jadi itu bukan pilihan yang efisien.

masukkan deskripsi gambar di sini

Bryce
sumber
22

Dalam hal ini keduanya strconvdan fmt.Sprintfmelakukan pekerjaan yang sama tetapi menggunakan fungsi strconvpaket Itoaadalah pilihan terbaik, karena fmt.Sprintfmengalokasikan satu objek lagi selama konversi.

periksa hasil nenchmark dari keduanya periksa patokan di sini: https://gist.github.com/evalphobia/caee1602969a640a4530

lihat https://play.golang.org/p/hlaz_rMa0D misalnya.

manigandand
sumber
1
@Boon In berdampak nyata ke aplikasi Anda? Seperti biasa - itu tergantung. Objek lain berarti satu objek lagi, di luar memori kecil sementara yang jelas, perlu dikumpulkan. Jika Anda memanggil fungsi dengan kecepatan tinggi, misalnya sebagai bagian dari beberapa proses serialisasi yang digunakan setiap kali pesan diterima dari suatu tempat, itu bisa berdampak signifikan. Karena fmt.Sprintfdan strconv.iotaserupa dalam hal kemudahan penggunaan dan data di atas menunjukkan iota menjadi lebih cepat dengan dampak GC yang lebih rendah, tampaknya iotaharus digunakan secara umum ketika bilangan bulat tunggal perlu dikonversi.
Edward
Sepertinya optimasi prematur bagi saya untuk berpikir pada level ini begitu cepat. Yang terbaik adalah menulis kode yang dapat dibaca terlebih dahulu.
Boon
@ Boon Mereka sama-sama dapat dibaca. Mungkin juga gunakan yang lebih cepat. Juga, apa yang harus dikatakan programmer Golang baru tidak memulai dengan sesuatu yang melakukan banyak konversi ini? Saya seorang programmer berpengalaman menulis kode Golang pertama saya sekarang dan saya dalam situasi itu.
sudo
9

Konversi int64:

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

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

ok, kebanyakan dari mereka telah menunjukkan Anda sesuatu yang baik. Biarkan saya memberi Anda ini:

// 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
sumber
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
sumber