Goでint値を文字列に変換する方法は?


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

sは 'E'ですが、私が欲しいのは "123"です

「123」の入手方法を教えてください。

そしてJavaでは、私はこのようにすることができます:

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

concatGoで2つの文字列を使用するにはどうすればよいですか?


2番目の質問(文字列の連結)には効率をカバーする他の場所での回答があります。
RedGrittyBrick

回答:


772

strconvパッケージのItoa関数を使用します。

例えば:

package main

import (
    "strconv"
    "fmt"
)

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

文字列を連結+するかJoinstringsパッケージの関数を使用するだけで、文字列を連結できます。


97
言語設計者は、「Itoa」のような不可解な関数名が、もう少し説明的なものよりも好ましいと考えたのはなぜですか?
ルーク

25
@lukeこれは、マシン全体が256Kのメモリを備えている可能性があるCの遺産から来ています。使いやすさは、より多くの機能を組み込むために犠牲にされました。Goの作成者はすべて、その遺産に深く埋め込まれ、これらの名前に完全に満足しています。
ブライアン

117
アクセシビリティと学習のしやすさよりも歴史を優先させることは、設計IMOとしては悪いことです。:(
ルーク

32
@Lukeターゲットユーザーが誰で、規約がどれほど強力かによって異なります。一部のUIにはまだ保存アイコンとしてフロッピーディスクがあります:)
Nathron

65
名前を簡単に思い出せるItoA - Integer to ASCII
Ivan Aracki

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

あなたは、値の特定のタイプは、例えば、対応するフォーマッタを使用して知っている場合%dのためにint

詳細-fmt


%dfor int-this
scniro

4
これはリフレクションを使用するため、他の変換方法よりもはるかに効率が悪いため、これはお勧めしません。
Ricardo Souza


43

fmt.Sprintfstrconv.Itoaそしてstrconv.FormatInt仕事をします。ただしSprintf、パッケージを使用し、reflectさらに1つのオブジェクトを割り当てるため、効率的な選択ではありません。

ここに画像の説明を入力してください



22

この場合、strconvとの両方fmt.Sprintfが同じジョブを実行しますが、変換中に1つ以上のオブジェクトを割り当てるため、strconvパッケージのItoa関数を使用するのが最適fmt.Sprintfです。

両方のベンチマーク結果を確認する ここでベンチマークを確認してください:https//gist.github.com/evalphobia/caee1602969a640a4530

たとえば、https://play.golang.org/p/hlaz_rMa0Dを参照してください


1
@Boonアプリに目に見える影響がありますか?いつものように-それは異なります。別のオブジェクトは、明らかに一時的な小さなメモリヒットを超えて、もう1つのオブジェクトがガベージコレクションされる必要があることを意味します。たとえば、どこかからメッセージが受信されるたびに使用されるいくつかのシリアル化プロセスの一部として、関数を高い頻度で呼び出す場合、それは大きな影響を与える可能性があります。以来fmt.Sprintfstrconv.iota使いやすさとイオタが低いGCの影響でより速くなるように上記データが示すという点で類似しており、それが表示されるiota単一の整数を変換する必要がある場合に一般的に使用されるべきです。
エドワード

このレベルですぐに考えるのは時期尚早の最適化のようです。最善の方法は、まず読み取り可能なコードを記述することです。
ブーン

@Boon彼らは同じように読みやすいです。高速のものを使用することもできます。また、新しいGolangプログラマーは、これらの変換の多くを行うものから始めていないとはどういうことですか?私は今、最初のGolangコードを書いている経験豊富なプログラマーで、そのような状況にあります。
sudo


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.