如何在Go中将int值转换为字符串?


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

s是“ E”,但我想要的是“ 123”

请告诉我如何获得“ 123”。

在Java中,我可以这样进行:

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

如何concat在Go中输入两个字符串?


第二个问题(字符串连接)在其他地方都有涉及效率的答案
RedGrittyBrick

Answers:


772

使用strconv包的Itoa功能。

例如:

package main

import (
    "strconv"
    "fmt"
)

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

您可以简单地通过+对字符串进行连接或使用包的Join功能来连接字符串strings


97
为什么语言设计者认为像“ Itoa”这样的隐秘函数名称比可能更具描述性的名称更可取?
路加福音

25
@luke它来自C遗产,整个机器可能具有256K内存;牺牲了可用性以适应更多功能。Go的创建者都深深地扎根于该传统中,对这些名称感到完全自在。
布赖恩

117
将历史置于可访问性和易学习之上,这是糟糕的设计IMO。:(
路加福音

32
@Luke取决于您的目标用户是谁以及约定的强度。某些用户界面仍然有一张软盘作为“保存”图标:)
纳斯隆

65
为轻松记住名称ItoA - ASCII的整数
Ivan Aracki '18



43

fmt.Sprintfstrconv.Itoa并且strconv.FormatInt会完成工作。但是Sprintf将使用package reflect,并且它将分配另一个对象,因此这不是一个有效的选择。

在此处输入图片说明



22

在这种情况下,两个strconvfmt.Sprintf做同样的工作,但使用该strconv软件包的Itoa功能是最好的选择,因为fmt.Sprintf在转换过程中分配一个多个对象。

检查两者的基准结果 在此处检查基准:https : //gist.github.com/evalphobia/caee1602969a640a4530

例如,请参见https://play.golang.org/p/hlaz_rMa0D


1
@Boon对您的应用有明显影响吗?一如既往-这取决于。另一个对象意味着除了明显的临时小内存不足以外,还有一个对象需要进行垃圾回收。如果您以很高的速度调用该函数,例如,作为从任何地方收到消息时使用的某些序列化过程的一部分,则可能会产生重大影响。由于fmt.Sprintfstrconv.iota的易用性相似,并且以上数据显示iota更快,对GC的影响更小,因此似乎iota通常应在单个整数需要转换时使用。
爱德华

在我看来,这么早就想过早进行优化。最好是先编写可读代码。
Boon

@Boon同样具有可读性。最好使用速度更快的产品。另外,怎么说新的Golang程序员不是从进行大量此类转换的东西开始的?我是一位经验丰富的程序员,目前正在编写我的第一个Golang代码。
sudo

9

转换int64

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

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

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)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.