1 2 | i := 123 s := string(i) |
s是'E',但我想要的是"123"
请告诉我如何获得"123"。
在Java中,我可以这样做:
1 | String s ="ab" +"c" // s is"abc" |
我怎么能在Go中使用
- 第二个问题(字符串连接)在其他地方有一个覆盖效率的答案。
使用
例如:
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) } |
您可以简单地通过
- 如果你要做很多字符串连接(例如构建一个长字符串)并希望你的代码更快,分配更少,你应该考虑使用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); |
如果您知道特定类型的值,请使用相应的格式化程序,例如
更多信息 - fmt
-
fmt.Sprint(value) 也有效 -
%d for int - this - 所有格式动词(%s,%d,%+ v,...)gobyexample.com/string-formatting
- 我不建议这样做,因为它比其他转换方法效率低得多,因为它使用反射。
有趣的是,
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.Sprintf
例如,请参见http://play.golang.org/p/bXb1vjYbyc。
在这种情况下,
在这里检查基准:https://gist.github.com/evalphobia/caee1602969a640a4530
例如,请参阅https://play.golang.org/p/hlaz_rMa0D。
- 还有一个对象要对性能做些什么呢?
-
@Boon对您的应用产生明显影响?一如既往 - 这取决于。另一个对象意味着除了明显的临时小内存命中之外,还需要另外一个对象进行垃圾回收。如果您以高速率调用该函数,例如作为从某个地方收到消息时使用的某些序列化过程的一部分,它可能会产生重大影响。由于
fmt.Sprintf 和strconv.iota 在易用性方面相似,并且上述数据显示随着GC影响较小,iota更快,因此当单个整数需要转换时,通常应该使用iota 。 - 似乎过早的优化让我很快就会在这个层面上思考。最好是先写可读代码。
- @Boon他们同样可读。不妨使用速度更快的一个。另外,一个新的Golang程序员不会从那些能够完成大量转换的东西开始呢?我是一名经验丰富的程序员,现在正在编写我的第一个Golang代码,并处于这种情况。
转换
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) } |