Go语言的字符串是一个用UTF-8编码的变宽字符序列,它的每一个字符都用一个或多个字节表示 。

在Go语言中,没有字符类型,字符类型是rune类型,rune是int32的别称。可使用 []byte() 获取字节,使用 []rune() 获取字符,可对中文进行转换。

定义字符串

第一种,双引号,用来创建可解析的字符串字面量 (支持转义,但不能用来引用多行);

str := "Go语言字符串\n不能跨行赋值"

第二种,反引号,用来创建原生的字符串字面量 ,这些字符串可能由多行组成(不支持任何转义序列),原生的字符串字面量多用于书写多行消息、HTML以及正则表达式。

str := `Go原生原格式字符串
可以跨行`

注意:单引号不能用于定义字符串,单引号用于定义Go语言的一个特殊类型 rune,类似其他语言的byte但又不完全一样,是指码点字面量(Unicode code point),不做任何转义的原始内容。

连接字符串

第一种,直接使用 "+" 运算符链接

str := "hello" + "oldboy"

golang 里面的字符串都是不可变的,每次运算都会产生一个新的字符串,所以会产生很多临时的无用的字符串,不仅没有用,还会给 gc 带来额外的负担,所以性能比较差。

注意:连接跨行字符串时,"+" 必须在上一行末尾,否则导致编译错误。

str := "hello" +
"oldboy" +
"PythonAV"
fmt.Println(str)

第二种,使用 fmt.Sprintf() 链接

str := fmt.Sprintf("%s,%s", "hello", "oldboy")

内部使用 []byte 实现,不像直接运算符这种会产生很多临时的字符串,但是内部的逻辑比较复杂,有很多额外的判断,还用到了 interface,所以性能也不是很好。

第三种,使用 strings.Join() 链接

str := strings.Join([]string{"hello", "oldboy"}, ",")

join会先根据字符串数组的内容,计算出一个拼接之后的长度,然后申请对应大小的内存,一个一个字符串填入,在已有一个数组的情况下,这种效率会很高,但是本来没有,去构造这个数据的代价也不小。

第四种,使用 buffer.WriteString() 链接

var buffer bytes.Buffer
buffer.WriteString("hello")
buffer.WriteString(",")
buffer.WriteString("oldboy")
str := buffer.String()

这个比较理想,可以当成可变字符使用,对内存的增长也有优化

字符串长度

第一种,将字符串转换为 []rune 后调用 len 函数进行统计

str := "hello oldboy春生"
length0 := len(str)
length1 := len([]rune(str))
fmt.Println(length0,length1)

在 Golang 中,如果字符串中出现中文字符不能直接调用 len 函数来统计字符串字符长度,这是因为在 Go 中,字符串是以 UTF-8 为格式进行存储的,在字符串上调用 len 函数,取得的是字符串包含的 byte 的个数。

第二种,使用 bytes.Count() 统计

func Count(s, sep []byte) int

计算字节切片sep在字节切片s中非重叠显示的个数,如果 sep 为 nil,则返回 s 中的字符个数 + 1。

package main

import (
"fmt"
"strings"
) func main() {
str := "hello oldboy春生"
length := strings.Count(str, "") -
fmt.Println(length)
}

第四种,使用 utf8.RuneCountInString() 统计

func RuneCountInString(s string) (n int)

返回 s 字符串长度,可以正常解析中文,一个中文被当做一个字符。

package main

import (
"fmt"
"unicode/utf8"
) func main() {
str := "hello oldboy"
length := utf8.RuneCountInString(str)
fmt.Println(length)
}

字符串操作 

使用索引号 "[ ]" 返回子串。 返回的字符串依然指向原字节数组,仅修改了指针和长度属性。实例如下:

package main

import (
"fmt"
) func main() {
str := "hello, oldboy"
s1 := str[:]
s2 := str[:]
fmt.Println(s1, s2)
}

运行结果:

hello oldboy

修改字符串,可先将其转换成 []rune 或 []byte,完成后再转换为 string。无论哪种转换,都会重新分配内存,并复制字节数组。实例如下:

package main

import "fmt"

func main() {
str1 := "hello oldboy"
s1 := []byte(str1)
s1[] = 'H'
fmt.Println(string(s1)) str2 := "鸟宿池边树,僧推月下门。"
s2 := []rune(str2)
s2[] = '敲'
fmt.Println(string(s2))
}

运行结果:

Hello oldboy
鸟宿池边树,僧敲月下门。

Go语言字符串的更多相关文章

  1. C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作  strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat( ...

  2. C语言字符串拷贝

    C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include <stdio.h> #include <assert.h> #include <stri ...

  3. C语言字符串长度(转)

    C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项. C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度. 在程序里,一般会用strlen()函数或sizeof ...

  4. C语言字符串操作常用库函数

    C语言字符串操作常用库函数 *********************************************************************************** 函数 ...

  5. c语言字符串操作大全

     C语言字符串操作函数 函数名: strcpy 功  能: 拷贝一个字符串到另一个 用  法: char *stpcpy(char *destin, char *source); 程序例: #incl ...

  6. 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

  7. C 语言字符串连接的 3种方式

    C 语言字符串连接的 3种方式 #include<stdio.h> #include<stdlib.h> #include<string.h> char *join ...

  8. C语言字符串声明

    重新学习C语言字符串声明char *a="nihao";char a[]="nihao";什么区别?前者定义的是指针,并且指向字符串常量“nihao”,后者是字 ...

  9. C语言字符串操作函数整理

    整理C语言字符串相关的函数,以程序方式验证,以注释方式做说明. #include<stdio.h> #include<string.h> #include<stdlib. ...

  10. 13-C语言字符串函数库

    目录: 一.C语言字符串函数库 二.用命令行输入参数 回到顶部 一.C语言字符串函数库 1 #include <string.h> 2 字符串复制 strcpy(参数1,参数2); 参数1 ...

随机推荐

  1. Python将阿拉伯数字转化为中文大写-乾颐堂

    利用Python将阿拉伯数字转化为中文大写,其实最麻烦的地方就是中间空多个0的问题,这种情况下,采用拆分法则,将一个大数字,先拆分成整数部分和小数部分,再对整数部分按照仟.万.亿.兆分位拆分为四个字符 ...

  2. [SoapUI] 设置Excel的第一行为自动过滤

    import org.apache.poi.ss.util.* XSSFWorkbook workbook = new XSSFWorkbook() XSSFSheet sheet = workboo ...

  3. 封装request.get_params批量取值

    @json_request_validator(post_schema) 装饰器 from functools import wraps from schema import SchemaError ...

  4. 白盒测试实践--Day3 12/19/2017

    累计完成任务情况: 阶段内容 参与人 完成静态代码检查结果报告 小靳 完成JUnit脚本编写 小黄 完成CheckStyle检查 小靳 完成代码评审会议纪要和结果报告 小熊.小梁及其他 完成白盒测试用 ...

  5. git hook 自动部署

    1. 当前虚拟站点根目录的 .git/ 权限 2. 当前项目裸仓库创建 hooks/post-receive 文件,并给予x 的权限 3. 复制如下内容 #!/bin/sh unset $(git r ...

  6. Hadoop(分布式系统基础架构)---Hive与HBase区别

    对于刚接触大数据的用户来说,要想区分Hive与HBase是有一定难度的.本文将尝试从其各自的定义.特点.限制.应用场景等角度来进行分析,以作抛砖引玉之用.  Hive是什么? Apache Hive是 ...

  7. C#中使用多线程访问Winform中控件的若干问题

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial  ...

  8. numpy.convolve()

    卷积函数: numpy.convolve(a, v, mode='full') Parameters: a : (N,) array_like First one-dimensional input ...

  9. Linux 判断进程是否已经运行的程序

    bool ServerProcess::isAlreadyRunning() { #ifndef __linux__ WarningLog(<<"can't check if p ...

  10. APUE(7)---进程环境

    一.main函数 C程序总是从main函数开始执行.main函数的原型是: int main(int argv, char *argv[]); 当内核执行C程序时,在调用main前先调用一个特殊的启动 ...