如何在 Go 中将 int 值转换为字符串?
Posted
技术标签:
【中文标题】如何在 Go 中将 int 值转换为字符串?【英文标题】:How to convert an int value to string in Go? 【发布时间】:2012-04-23 18:11:16 【问题描述】:i := 123
s := string(i)
s 是“E”,但我想要的是“123”
请告诉我如何获得“123”。
而在Java中,我可以这样做:
String s = "ab" + "c" // s is "abc"
我如何在 Go 中 concat
两个字符串?
【问题讨论】:
第二个问题(字符串连接)有an answer elsewhere,涵盖了效率。strconv.Itoa(i)
(int to ASCII) 将 int 设置为字符串。见***.com/a/62737936/12817546。 strconv.Atoi(s)
(ASCII 到 int)将字符串设置为 int。见***.com/a/62740786/12817546。
【参考方案1】:
推荐的答案
Go Language
使用strconv
包的Itoa
函数。
例如:
package main
import (
"strconv"
"fmt"
)
func main()
t := strconv.Itoa(123)
fmt.Println(t)
您可以简单地通过+
'ing 或使用strings
包的Join
函数来连接字符串。
【讨论】:
为什么语言设计者认为像“Itoa”这样的神秘函数名称比可能更具描述性的名称更可取? @luke 它来自 C 遗产,整个机器可能有 256K 内存;牺牲了可用性以适应更多功能。Go 的创造者都深深地融入了这种传统,并且对这些名称感到完全满意。 将历史置于可访问性和易于学习之上是糟糕的设计 IMO。 :( @Luke 取决于您的目标用户是谁以及约定的强度。一些用户界面仍然有一个软盘作为保存图标:) 便于记忆名称ItoA - 整数转ASCII【参考方案2】:您可以使用fmt.Sprintf 或strconv.FormatFloat
例如
package main
import (
"fmt"
)
func main()
val := 14.7
s := fmt.Sprintf("%f", val)
fmt.Println(s)
【讨论】:
【参考方案3】:fmt.Sprintf("%v",value);
如果您知道特定类型的值,请使用相应的格式化程序,例如 %d
用于 int
更多信息 - fmt
【讨论】:
%d
for int - this
我不建议这样做,因为它使用反射,因此效率远低于其他转换方法。
很棒的评论@RicardoSouza。我在这里引用了你***.com/a/62725637/12817546。【参考方案4】:
有趣的是strconv.Itoa
是shorthand
func FormatInt(i int64, base int) string
以 10 为底
例如:
strconv.Itoa(123)
等价于
strconv.FormatInt(int64(123), 10)
【讨论】:
有趣的是,根据***.com/a/38077508/968244的基准,直接调用 FormatInt() 而不是 Itoa() 可以节省 0.1 纳秒【参考方案5】:fmt.Sprintf
、strconv.Itoa
和 strconv.FormatInt
将完成这项工作。但是Sprintf
会使用包reflect
,而且会多分配一个对象,所以不是一个高效的选择。
【讨论】:
【参考方案6】:在这种情况下,strconv
和 fmt.Sprintf
执行相同的工作,但使用 strconv
包的 Itoa
函数是最佳选择,因为 fmt.Sprintf
在转换过程中会多分配一个对象。
在此处查看基准:https://gist.github.com/evalphobia/caee1602969a640a4530
例如见https://play.golang.org/p/hlaz_rMa0D。
【讨论】:
@Boon 对您的应用有明显的影响?一如既往 - 这取决于。另一个对象意味着除了明显的临时小内存命中之外,还有一个对象需要进行垃圾回收。如果您以高速率调用该函数,例如作为从某个地方收到消息时使用的某些序列化过程的一部分,它可能会产生重大影响。由于fmt.Sprintf
和strconv.iota
在易用性方面相似,并且上述数据显示iota 速度更快,GC 影响更小,因此当单个整数需要转换时,似乎一般应使用iota
。跨度>
对我来说,这么快就考虑到这个级别似乎是过早的优化。最好是先写可读的代码。
@Boon 它们同样具有可读性。还不如使用更快的。另外,一个新的 Golang 程序员不是从做很多这些转换的东西开始的,怎么说呢?我是一位经验丰富的程序员,现在正在编写我的第一个 Golang 代码,并且处于这种情况。【参考方案7】:
正在转换int64
:
n := int64(32)
str := strconv.FormatInt(n, 10)
fmt.Println(str)
// Prints "32"
【讨论】:
【参考方案8】: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)
【讨论】:
【参考方案9】:好的,他们中的大多数都向您展示了一些好东西。 让我给你这个:
// 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 以获得完整列表【参考方案10】:另一种选择:
package main
import "fmt"
func main()
n := 123
s := fmt.Sprint(n)
fmt.Println(s == "123")
https://golang.org/pkg/fmt#Sprint
【讨论】:
以上是关于如何在 Go 中将 int 值转换为字符串?的主要内容,如果未能解决你的问题,请参考以下文章