如何在Go语言中将整数转换为字符串?

767
i := 123
s := string(i) 
s是'E',但我想要的是"123"。 请告诉我如何获取"123"。 在Java中,我可以这样做:

s是'E',但我需要的是"123"。

请告诉我如何获取"123"。

在Java中,我可以这样做:

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

如何在Go语言中连接两个字符串?


第二个问题(字符串连接)在其他地方有答案,涵盖了效率。 - RedGrittyBrick
strconv.Itoa(i)(int转ASCII)将一个整数设置为字符串。请参见https://dev59.com/e2Yr5IYBdhLWcg3w0taE#62737936。`strconv.Atoi(s)`(ASCII转int)将一个字符串设置为整数。请参见https://dev59.com/OVwZ5IYBdhLWcg3waPvX#62740786。 - user12817546
10个回答

1182

使用strconv包中的Itoa函数。

例如:

package main

import (
    "strconv"
    "fmt"
)

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

您可以通过将字符串简单地连接起来,使用加号+或使用strings包中的Join函数来实现。


248
为什么编程语言的设计者们认为像"Itoa"这样的晦涩函数名比描述性更好? - Luke
58
来自 C 语言的传承,当时整个计算机只有 256K 的内存;为了容纳更多的功能,可用性被牺牲了。Go 语言的创建者们都深深地植根于这种传承中,并且对这些名称感到完全自在。@luke - Bryan
237
我认为把历史放在易于学习和获取的设计之上是不好的。:( - Luke
60
取决于你的目标用户和传统程度。有些用户界面仍然使用软盘作为保存图标 :) - Nathron
167
为了方便记忆,名称为ItoA - Integer to ASCII。 - Ivan Aracki
显示剩余11条评论

199
fmt.Sprintf("%v",value);
如果您知道值的具体类型,请使用相应的格式化程序,例如%d表示int
更多信息- fmt

1
%d 代表整数 - 这个。 - scniro
32
我不建议这样做,因为它使用反射,效率比其他转换方法要低得多。 - Ricardo Souza
2
了不起的评论@RicardoSouza。我在这里引用了你的话https://dev59.com/CmIk5IYBdhLWcg3wfOSe#62725637。 - user12817546
2
但如果你不知道具体的类型,Sprintf 是一条捷径。 - Himanshu

92

fmt.Sprintfstrconv.Itoastrconv.FormatInt 可以完成这个任务。但是,Sprintf 会使用 reflect 包,并且会分配一个额外的对象,因此它不是一个高效的选择。

enter image description here


strconv.FormatUint() 用于将 uint64 转换为 string - Eric

78

有趣的是,strconv.Itoa缩写

func FormatInt(i int64, base int) string

使用十进制

例如:

strconv.Itoa(123)

等同于

strconv.FormatInt(int64(123), 10)

12
有趣的是,根据https://dev59.com/3mkw5IYBdhLWcg3wJXIh#38077508上的基准测试,直接调用FormatInt()而非Itoa()可以节省0.1纳秒。 - isapir

46
您可以使用 fmt.Sprintfstrconv.FormatFloat
例如:
package main

import (
    "fmt"
)

func main() {
    val := 14.7
    s := fmt.Sprintf("%f", val)
    fmt.Println(s)
}

34

1
@Boon 对你的应用程序有明显的影响吗?像往常一样,这取决于情况。另一个对象意味着需要垃圾回收的一个以上的对象,除了显而易见的临时小内存开销。如果你高频率地调用该函数,例如作为某个序列化过程的一部分,每当从某个地方接收到消息时使用,它可能会产生重大影响。由于 fmt.Sprintfstrconv.iota 在易用性方面相似,并且上述数据显示 iota 的速度更快,对 GC 的影响更小,因此在需要转换单个整数时,通常应使用 iota - Edward
1
对我来说,这似乎是过早地进行优化。最好先编写可读性强的代码。 - Boon
@Boon 两种方式的可读性相同,最好使用更快的一种。而且,谁能保证一个新的 Golang 程序员不是从需要进行大量这些转换的项目开始学习呢?我是一名有经验的程序员,现在正在编写我的第一个 Golang 代码,并处于这种情况下。 - sudo

14

转换 int64

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

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

12

非常感谢。这是一个方便且易于记忆的解决方案(我的观点)。 - guettli

8

好的,他们中的大多数都向您展示了一些有用的东西。让我给你介绍这个:

// 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 ""
    }
}

这太棒了!您可以包括uint+uint8-64以获得完整的列表。 - evilReiko
或者你可以直接使用 fmt.Sprint,它可以做到同样的效果(除了 time.Timejsoncrack.Time(一个我从未听说过的依赖包)值)。 - dolmen

4
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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接