Go'da int değerini dizeye nasıl dönüştürebilirim?


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

s 'E', ama istediğim "123"

Lütfen "123" e nasıl ulaşacağımı söyle.

Ve Java'da şu şekilde yapabilirim:

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

concatGo'da nasıl iki dize oluşturabilirim?


İkinci soru (dize birleştirme) başka bir yerde verimliliği kapsayan bir cevaba sahiptir .
RedGrittyBrick

Yanıtlar:


772

strconvPaketin Itoaişlevini kullanın .

Örneğin:

package main

import (
    "strconv"
    "fmt"
)

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

Dizeleri basitçe kapatarak +veya paketin Joinişlevini kullanarak birleştirebilirsiniz strings.


97
Dil tasarımcıları neden "Itoa" gibi şifreli işlev adlarının biraz daha açıklayıcı olabilecek bir şeye tercih edildiğini düşündüler?
Luke

25
@luke tüm makinenin 256K belleğe sahip olabileceği C mirasından gelir; kullanılabilirlik daha fazla işlevsellik sığdırmak için feda edildi. Go'nun yaratıcıları bu mirasa derinden gömülüdür ve bu isimlerle tamamen rahat hissederler.
Bryan

117
Tarihi erişilebilirliğin ve öğrenme kolaylığının üstüne koymak kötü tasarım IMO'sudur. :(
Luke

32
@ Luke Hedef kullanıcılarınızın kim olduğuna ve sözleşmenin ne kadar güçlü olduğuna bağlıdır. Bazı kullanıcı arayüzlerinde Kaydet simgesi olarak hala bir disket var :)
Nathron

65
kolay hatırlanan isim ItoA - ASCII Tamsayı
Ivan Aracki

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

Eğer değer belirli tip örneğin ilgili formatlayıcıyı kullanmak biliyorsanız %diçinint

Daha Fazla Bilgi - FMT


%dint için - bu
scniro

4
Yansıma kullandığından, bu diğer dönüştürme yöntemlerinden çok daha az verimli olduğu için bunu tavsiye etmem.
Ricardo Souza


43

fmt.Sprintf, strconv.ItoaVe strconv.FormatIntiş yapacak. Ancak Sprintfpaketi kullanacak ve reflectbir nesne daha tahsis edecek, bu yüzden etkili bir seçim değil.

resim açıklamasını buraya girin



22

Her iki Bu durumda strconvve fmt.Sprintfaynı işi ama kullanarak strconvpaketin Itoaçünkü işlevini en iyi seçimdir fmt.Sprintfdönüştürme sırasında bir kez daha nesne tahsis.

ikisinin de sonuç işaretini kontrol et karşılaştırmalı değerlendirmeyi buradan kontrol edin: https://gist.github.com/evalphobia/caee1602969a640a4530

bkz. https://play.golang.org/p/hlaz_rMa0D .


1
@Boon Uygulamanızın görünür etkisi var mı? Her zaman olduğu gibi - duruma göre değişir. Başka bir nesne, bariz geçici küçük hafıza isabetinin ötesinde, bir nesnenin daha çöp toplanması gerektiği anlamına gelir. İşlevi yüksek hızlarda çağırıyorsanız, örneğin bir yerden bir mesaj alındığında kullanılan bazı serileştirme işleminin bir parçası olarak, bunun önemli bir etkisi olabilir. Yana fmt.Sprintfve strconv.iotakullanım kolaylığı ve iyota hızlı düşük GC etki olmak Yukarıdaki veriler gösterir açısından benzer olan, görünür iotatek bir tam sayı dönüştürücü gereken zaman, genel olarak kullanılmalıdır.
Edward

Çok yakında bu düzeyde düşünmemin benim için erken optimizasyon gibi görünüyor. En iyisi önce okunabilir kod yazmaktır.
Boon

@Boon Eşit olarak okunabilirler. Daha hızlı olanı da kullanabilir. Ayrıca, yeni bir Golang programcısının bu dönüşümlerin çoğunu yapan bir şeyle başlamadığını söylemek gerekir? Şu anda ilk Golang kodumu yazan deneyimli bir programcıyım ve bu durumdayım.
sudo

9

Dönüştürme int64:

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

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

3

tamam, çoğu size iyi bir şey gösterdi. Size şunu vereyim:

// 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)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.