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

har*_*ass 447 string int go converters

i := 123
s := string(i) 
Run Code Online (Sandbox Code Playgroud)

s是'E',但我想要的是"123"

请告诉我如何获得"123".

在Java中,我可以这样做:

String s = "ab" + "c"  // s is "abc"
Run Code Online (Sandbox Code Playgroud)

我怎么能concat在Go中使用两个字符串?

Kla*_*sen 706

使用strconv包的Itoa功能.

例如:

package main

import (
    "strconv"
    "fmt"
)

func main() {
    t := strconv.Itoa(123)
    fmt.Println(t)
}
Run Code Online (Sandbox Code Playgroud)

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

  • 将历史置于可访问性和易学性之上是错误的设计IMO.:( (100认同)
  • 为什么语言设计者认为像"Itoa"这样的神秘功能名称比那些可能更具描述性的东西更可取? (78认同)
  • 为了便于记忆名称**ItoA** - **整数到ASCII** (47认同)
  • @Luke取决于您的目标用户是谁以及约定有多强.一些用户界面仍然有一个软盘作为保存图标:) (23认同)
  • @luke它来自C传承,整个机器可能有256K内存; 牺牲了可用性以适应更多的功能.Go的创造者都深深地融入了这种传统,并且对这些名称感到非常舒服. (22认同)
  • 我喜欢这个评论部分决定它是确定 Go 根源和设计决策价值的地方。 (6认同)
  • 如果你要做很多字符串连接(例如构建一个长字符串)并希望你的代码更快,分配更少,你应该考虑使用bytes.Buffer(它是Java的StringBuilder的一种更通用的版本) ). (4认同)
  • `Itoa` 只执行 `return FormatInt(int64(i), 10)`。在我看来,“FormatInt”函数既不神秘,也不是糟糕的设计。我真的很喜欢这里的快捷方式,即 `Itoa` 是对 C 中相同方法的致敬。 (3认同)
  • @卢克,我讨厌你这么合理和正确。这些类似C的秘密暗示是Go的性吸引力的一部分! (2认同)
  • 如果你继续使用 `bytes.Buffer` 会咬你的手指。改用`strings.Builder`。 (2认同)
  • @Bryan除此之外,他们进行了大量随机更改以使其不像C,例如在声明变量时将类型放在名称之后。 (2认同)

Jas*_*ngh 133

fmt.Sprintf("%v",value);
Run Code Online (Sandbox Code Playgroud)

如果你知道值的具体类型使用相应的格式,例如%d用于int

更多信息 - fmt

  • 我不推荐这样做,因为这比其他转换方法效率低得多,因为它使用反射。 (12认同)
  • 但如果您不知道具体类型,Sprintf 是最佳选择。 (2认同)

kgt*_*eat 44

有趣的是,要注意strconv.Itoa速记

func FormatInt(i int64, base int) string
Run Code Online (Sandbox Code Playgroud)

基地10

例如:

strconv.Itoa(123)
Run Code Online (Sandbox Code Playgroud)

相当于

strconv.FormatInt(int64(123), 10)
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,根据/sf/answers/2665425591/上的基准,直接调用FormatInt()而不是Itoa()可以节省0.1纳秒。 (2认同)

Bry*_*yce 37

fmt.Sprintf,strconv.Itoa并且strconv.FormatInt将做的工作.但是Sprintf会使用这个包reflect,它会再分配一个对象,所以它不是一个好的选择.

在此输入图像描述


man*_*and 21

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

检查两者的nenchmark结果 在这里检查基准:https://gist.github.com/evalphobia/caee1602969a640a4530

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


小智 13

另外一个选择:

package main
import "fmt"

func main() {
   n := 123
   s := fmt.Sprint(n)
   fmt.Println(s == "123")
}
Run Code Online (Sandbox Code Playgroud)

https://golang.org/pkg/fmt#Sprint


Cae*_*chi 6

转换int64

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

fmt.Println(str)
// Prints "32"
Run Code Online (Sandbox Code Playgroud)


小智 5

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

// 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 ""
    }
}
Run Code Online (Sandbox Code Playgroud)