1
2
i := 123
s := string(i)

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

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

在Java中,我可以这样做:

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

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

  • 第二个问题(字符串连接)在其他地方有一个覆盖效率的答案。

使用strconv包的Itoa功能。

例如:

1
2
3
4
5
6
7
8
9
10
11
package main

import (
   "strconv"
   "fmt"
)

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

您可以简单地通过+'或者使用strings包的Join函数来连接字符串。

  • 如果你要做很多字符串连接(例如构建一个长字符串)并希望你的代码更快,分配更少,你应该考虑使用bytes.Buffer(它是Java的StringBuilder的一种更通用的版本) )。
  • 为什么语言设计者认为像"Itoa"这样的神秘功能名称比那些可能更具描述性的东西更可取?
  • @luke它来自C传承,整个机器可能有256K内存;牺牲了可用性以适应更多的功能.Go的创造者都深深地融入了这种传统,并且对这些名称感到非常舒服。
  • 将历史置于可访问性和易学性之上是错误的设计IMO。 :(
  • @Luke取决于您的目标用户是谁以及约定有多强。一些用户界面仍然有一个软盘作为保存图标:)
  • @Luke我讨厌你对此如此合乎逻辑和正确。这些暗示C般的神秘感是Go性感的一部分! ??
  • 我首先尝试了更简单的string(2)并得到了"\x02"。知道为什么吗?
  • @JonathanLin是的,你只是得到ascii值2. ascii值0-31是特殊值,>32是可打印的。尝试谷歌搜索"ascii表"。
  • 为了便于记忆名称ItoA - 整数到ASCII
  • 如果继续使用,bytes.Buffer会咬你的手指。请改用strings.Builder
  • @IvanAracki很容易记住,因为它就是它的意思
  • Go是一个重新发明的轮子只是为了把谷歌的品牌放在上面。
  • @Luke我更喜欢这个在一个语句中超过80个字符代码宽度的函数调用的ObjC和Swift方式。
  • @Bryan除此之外,他们进行了大量的随机更改,使其不像C,例如在声明变量时将类型放在名称后面。
  • @sudo阅读这篇博文,看看为什么名字后的类型是更好的设计

1
fmt.Sprintf("%v",value);

如果您知道特定类型的值,请使用相应的格式化程序,例如%d int

更多信息 - fmt

  • fmt.Sprint(value)也有效
  • %d for int - this
  • 所有格式动词(%s,%d,%+ v,...)gobyexample.com/string-formatting
  • 我不建议这样做,因为它比其他转换方法效率低得多,因为它使用反射。

有趣的是,strconv.Itoa是简写

1
func FormatInt(i int64, base int) string

基地10

例如:

1
strconv.Itoa(123)

相当于

1
strconv.FormatInt(int64(123), 10)
  • undefined:strconv.Itoa中的strconv
  • @FeloVilches导入"strconv"
  • 有趣的是,根据stackoverflow.com/a/38077508/968244的基准测试,直接调用FormatInt()而不是Itoa()可以节省0.1纳秒。

fmt.Sprintfstrconv.Itoastrconv.FormatInt将完成这项工作。但Sprintf将使用包reflect,它将再分配一个对象,因此它不是一个好的选择。


您可以使用fmt.Sprintf

例如,请参见http://play.golang.org/p/bXb1vjYbyc。


在这种情况下,strconvfmt.Sprintf都执行相同的工作,但使用strconv包的Itoa函数是最佳选择,因为fmt.Sprintf在转换期间再分配一个对象。


在这里检查基准:https://gist.github.com/evalphobia/caee1602969a640a4530

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

  • 还有一个对象要对性能做些什么呢?
  • @Boon对您的应用产生明显影响?一如既往 - 这取决于。另一个对象意味着除了明显的临时小内存命中之外,还需要另外一个对象进行垃圾回收。如果您以高速率调用该函数,例如作为从某个地方收到消息时使用的某些序列化过程的一部分,它可能会产生重大影响。由于fmt.Sprintfstrconv.iota在易用性方面相似,并且上述数据显示随着GC影响较小,iota更快,因此当单个整数需要转换时,通常应该使用iota
  • 似乎过早的优化让我很快就会在这个层面上思考。最好是先写可读代码。
  • @Boon他们同样可读。不妨使用速度更快的一个。另外,一个新的Golang程序员不会从那些能够完成大量转换的东西开始呢?我是一名经验丰富的程序员,现在正在编写我的第一个Golang代码,并处于这种情况。

转换int64

1
2
3
4
5
n := int64(32)
str := strconv.FormatInt(n, 10)

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 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""
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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)
}