在 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

*/

一个简单的基准测试可以得出以下结论: (字符串拼接性能从高到底)

  1. strings.Builder
  2. bytes.Buffer
  3. fmt.Sprintf()
  4. +

各自取舍吧....

Go String的更多相关文章

  1. 透过WinDBG的视角看String

    摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...

  2. JavaScript String对象

    本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...

  3. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  4. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

  5. js报错: Uncaught RangeError: Invalid string length

    在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...

  6. c# 字符串连接使用“+”和string.format格式化两种方式

    参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...

  7. 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...

  8. JavaScript中String对象的方法介绍

    1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...

  9. 在多线程编程中lock(string){...}隐藏的机关

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...

  10. BCL中String.Join的实现

    在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...

随机推荐

  1. JDK Proxy和CGLIB Proxy

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  2. Guava中强大的排序器Ordering使用

    一 创建排序器 排序器:可以用来为构建复杂的比较器,以完成集合排序的功能: 本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例. Ordering把很多基于Comparat ...

  3. axure如何实现提示框3s后自动消失

    本示例基于axure8 实现 1.先做两个元件,一个按钮,一个提示框 2.将弹框“发布成功提示”设置为,页面载入时隐藏,这样预览页面时,该弹框是隐藏状态 3.给按钮添加交互样式,如下: 4.预览,点击 ...

  4. 通过指针突破C++类的访问权限

    看如下代码 #include "pch.h" #include <iostream> using namespace std; class A { public: A( ...

  5. Windows虚拟器的安装与使用

    前言 先说:你们要的东西我会放在文中和文章末尾,拿文件记得点赞,一手交钱一手交货 马上初中朋友们就要开始上网课了哎!(博主也是一位初中生) 有人可能会受网课的影响而不能……, 所以各路神仙研究出了各种 ...

  6. Asp.net core下利用EF core实现从数据实现多租户(1)

    前言 随着互联网的的高速发展,大多数的公司由于一开始使用的传统的硬件/软件架构,导致在业务不断发展的同时,系统也逐渐地逼近传统结构的极限. 于是,系统也急需进行结构上的升级换代. 在服务端,系统的I/ ...

  7. Codeforces 1065C Make It Equal (差分+贪心)

    题意:n个塔,第i个塔由$h_i$个cube组成,每次可以切去某高度h以上的最多k个cube,问你最少切多少次,可以让所有塔高度相等 k>=n, n<=2e5 思路:差分统计每个高度i有的 ...

  8. 《Python学习手册 第五版》 -第6章 动态类型

    本章主要讲述变量.对象.引用三者直接的关联及区别,详细说明了在变量赋值的操作中,计算机内部到底发生了什么,有哪些是不被人察觉和需要明确了解的 1.先从最简单的赋值语句开始 a=3 这一句,基本就能涵盖 ...

  9. Go语言实现:【剑指offer】数字在排序数组中出现的次数

    该题目来源于牛客网<剑指offer>专题. 统计一个数字在排序数组中出现的次数. 看到排序数组,要想到用二分查找. 先找到最前面的数字k,再找到最后面的数字k,通过下标求出次数. Go语言 ...

  10. Trie(字典树)的侃侃

    Trie是什么 ? 字典树 : 见名知意(在树上进行查询). 跟字典相关的必定与查询有密切的关系, 查询就需要一定的媒介作为支撑,树就为这种查询提供支撑. Trie做什么 ? 实现字符串快速检索的多叉 ...