Go String
在 Go 语言中, 字符串是基础数据类型之一, 关键字为 string.
变量声明
字符串变量的声明如下:
// 声明一个字符串类型的变量 s, 未赋予初始值时默认为零值""
var s string
// 当然也可以用短声明, 让编译器自动推导类型, 不过需要在定义明确赋予初始值.
s := ""
零值
字符串的零值是 "".
常用操作
// 字符串分割
s := "a-b-c"
a := strings.Split(s, "-") // 返回字符串切片
// [a b c]
// 字符串叠加
a := []string{"a", "b", "c"}
s := strings.Join(a, "-") // 返回字符串
// a-b-c
// 清除字符串左右2端的所有空字符
s := " a b c "
s = strings.TrimSpace(s)
// s = a b c
关于更多字符串操作方法可以查看标准库 strings...
类型转换
// 字符串转数值
s := "10"
i, err := strconv.Atoi(s)
// i = 10
// 数值转字符串
i := 99
s := strconv.Itoa(i)
// s = "99"
// 接口对象转字符串
var a interface{}
a = "str"
s := a.(string)
// s = "str"
关于更多字符串转换方法可以查看标准库 strconv...
性能比较
字符串的用途非常广泛, 那么字符串操作的性能是我们必须去考量的东西.
这里介绍几种常见的字符串连接方式, 并通过基准测试来获取我们需要的答案:
// string_contcat_test.go
package string
import (
"bytes"
"fmt"
"strings"
"testing"
)
// using +=
func BenchmarkStringAdd(b *testing.B) {
b.ResetTimer()
s := ""
for i := 0; i < b.N; i++ {
s += "s"
}
b.StopTimer()
}
// using Sprintf
func BenchmarkSprintf(b *testing.B) {
b.ResetTimer()
s := "s"
for i := 0; i < b.N; i++ {
s = fmt.Sprintf("%v", s)
}
b.StopTimer()
}
// using strings.Builder
func BenchmarkStringsBuilder(b *testing.B) {
b.ResetTimer()
var stringsBuilder strings.Builder
s := "s"
for i := 0; i < b.N; i++ {
stringsBuilder.WriteString(s)
}
_ = stringsBuilder.String()
b.StopTimer()
}
// using bytes.Buffer
func BenchmarkBytesBuffer(b *testing.B) {
b.ResetTimer()
s := "s"
var bytesBuffer bytes.Buffer
for i := 0; i < b.N; i++ {
bytesBuffer.WriteString(s)
}
_ = bytesBuffer.String()
b.StopTimer()
}
//
go test -v -bench=.
/*
goos: windows
goarch: amd64
pkg: github.com/taadis/letgo/_examples/keywords/string
BenchmarkStringAdd-4 600320 48977 ns/op
BenchmarkSprintf-4 9096511 129 ns/op
BenchmarkStringsBuilder-4 211771195 5.40 ns/op
BenchmarkBytesBuffer-4 100000000 11.8 ns/op
PASS
ok github.com/taadis/letgo/_examples/keywords/string 36.108s
*/
一个简单的基准测试可以得出以下结论: (字符串拼接性能从高到底)
strings.Builderbytes.Bufferfmt.Sprintf()+
各自取舍吧....
Go String的更多相关文章
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- js报错: Uncaught RangeError: Invalid string length
在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...
- c# 字符串连接使用“+”和string.format格式化两种方式
参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...
- 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...
- JavaScript中String对象的方法介绍
1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...
- 在多线程编程中lock(string){...}隐藏的机关
常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...
- BCL中String.Join的实现
在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...
随机推荐
- obj2gltf安装详细教程
在线转换地址:http://52.4.31.236/convertmodel.html 在使用cesium的过程中需要使用到gltf模型,官方推荐使用obj2gltf插件将obj模型转换成gltf格式 ...
- HTTP权威指南之URL与资源
前言 web基础中介绍了URI.URL与URN: URI是一类更通用的资源标识符,URL是它的一个子集: URI是一个通用的概念,它主要由URL与URN组成: URL是通过描述资源的位置来标识资源的, ...
- C++快读模板
C++的快速读入模板 inline int read() { ; char ch = getchar(); ') { if (ch == '-') flag = true; ch = getchar( ...
- NetModular 新年第一更以及升级指南(打造简单易用的.Net Core模块化快速开发框架~)
先给大家拜个晚年,祝大家身体健康,远离肺炎~ NetModular开源已有一年,在这一年收到了很多建议,框架也变得越来越完善.这次更新包括了从去年年尾到现在所做的更改,感觉更改的内容还是蛮多的,所以记 ...
- mplayer使用心得[转]
一直在用mplayer,其他的播放器很少用.以下是我使用过程中的一些心得. 注意,下面用的路径都是在我的电脑上的路径,使用时请不要照抄!应该换成你的电脑上的正确路径. 一.首先还是讲安装方面的问题 ...
- 使用Java迭代器实现Python中的range
如果要想迭代一个类的对象,那么该类必须实现 Iterable 接口,然后通过 iterator 方法返回一个 Iterator 实例. Range 类实现了Python中的range的所有用法,如:r ...
- [实用分享]Kindle电子书格式AZW3转换为MOBI
[实用分享]Kindle电子书格式AZW3转换为MOBI 思路:先拆解成源文件再转换成 MOBI 推荐首选这种方法.此方法的思路是,首先用 KindleUnpack 把 azw3 文件拆解成源文件,然 ...
- Codeforces_334_C
http://codeforces.com/problemset/problem/334/C 求不能凑整n,和最小,数量最多的数量. #include<iostream> #include ...
- HDU_4496_逆向并查集
http://acm.hdu.edu.cn/showproblem.php?pid=4496 逆向并查集,先读取,然后从后向前join每次保存答案即可. #include<iostream> ...
- JavaScript 与 Java 有什么不同?
JavaScript 编程语言是由 Netscape,Inc. 开发的,它并不是 Java 平台的一部分. JavaScript 不会创建小应用程序或独立应用程序.在最常见的形式中,JavaScrip ...