【问题标题】:How to convert an int value to string in Go?如何在 Go 中将 int 值转换为字符串?
【发布时间】: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 两个字符串?

【问题讨论】:

标签: string go int converters


【解决方案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。我在这里引用了你stackoverflow.com/a/62725637/12817546。
    【解决方案4】:

    有趣的是strconv.Itoa 是shorthand

    func FormatInt(i int64, base int) string
    

    以 10 为底

    例如:

    strconv.Itoa(123)
    

    等价于

    strconv.FormatInt(int64(123), 10)
    

    【讨论】:

    【解决方案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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-17
            • 2016-11-27
            • 2022-07-28
            • 2016-01-14
            • 1970-01-01
            • 2015-11-12
            相关资源
            最近更新 更多