golang之旅--数据类型之字符串
时间:2022-05-06
本文章向大家介绍golang之旅--数据类型之字符串,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
学习go已经有很长一段时间了,对于它的数据类型还没有更加深入的了解,这里做一下对数据类型的总结,第一篇是字符串的介绍。
golang中的字符串
func stringDemo() {
str := "李阳"
//len函数返回的是字节长度
fmt.Println(len(str))
//utf8的RuneCountInString判断的是ASCII长度
fmt.Println(utf8.RuneCountInString(str))
}
字符串拼接
在java中我们拼接字符串一般怎么做?用加号拼接、用StringBuffer、用StringBuilder。相对的在go中也有好几种方法,每种方法性能不一。
通过+进行字符串拼接
在go语言中,string在内存中的存储结构是长度固定的字节数组,也就是说是字符串是不可变的。当要修改字符串的时候,需要转换为[]byte,修改完成后再转换回来。但是不论怎么转换,都必须重新分配内存,并复制数据。
func appendStrUsePlus() {
var s1 = "Hello "
var s2 = "World"
s3 := s1 + s2
fmt.Println(s3)
}
复制代码
通过加号拼接字符串,每次都必须重新分配内存。所以如果是频繁的使用+进行拼接会存在严重的性能问题。怎么解决呢? 思路是:预分配足够大的内存空间,也就是我们接下来要说的strings.Join()方法,它会统计所有参数的长度,并一次性完成内存的分配操作。
通过strings.join()进行拼接
使用strings中的方法,需要引入strings库。
func appendStrUseJoin() {
s := make([]string, 10)
for i := 0; i < 10; i++ {
s[i] = "h"
}
fmt.Println(strings.Join(s, ","))//h,h,h,h,h,h,h,h,h,h
}
看一下string.Join()的源码,第一个参数是一个字符串数组,第二个参数是分隔符,有点类似Java中的StringUtils里的join方法。
func Join(a []string, sep string) string {
if len(a) == 0 {
return ""
}
if len(a) == 1 {
return a[0]
}
n := len(sep) * (len(a) - 1)
for i := 0; i < len(a); i++ {
n += len(a[i])
}
b := make([]byte, n)
bp := copy(b, a[0])
for _, s := range a[1:] {
bp += copy(b[bp:], sep)
bp += copy(b[bp:], s)
}
return string(b)
}
复制代码
通过buffer进行组装拼接
使用buffer是优先创建一个缓冲区,然后向缓冲区中写入数据,类似Java中的StringBuffer。
func appendStrUseBuf() {
var b bytes.Buffer
b.Grow(100)
for i := 0; i < 100; i++ {
b.WriteString("a")
}
fmt.Println(b.String())
}
字符串分割
在Java中我们有StringUtils.split()方法,在go中也存在类似的方法:strings.split()。
func splitStr() {
str := "liyang,liyang,liyang"
strs := strings.Split(str, ",")
fmt.Println(strs)
}
除此之外还有SplitN()、SplitAfter()、SpliteAfterN()方法,不过不是特别常用。
字符串截取
字符串实际上是一个字节数组,所以我们可以通过分片的方式来截取字符串。
字符串转字节数组
首先我们来看一段代码,之前已经提到过,字符串实际上是一个字节数组,所以我们可以像操作数组一样操作字符串的每个字节。
func strConsole() {
str := "liyang"
for i := 0; i < len(str); i++ {
fmt.Println(string(str[i]))
}
}
字符串默认值
字符串默认是是空字符串,不是nil。
func stringDefaultVal() {
var str string
fmt.Println(str == nil) //invalid operation: str == nil (mismatched types string and nil)
fmt.Println(str == "")
}
字符串存储结构
在Java中,字符串是通过char数组存储的,所以字符串是不可变的。那么在go语言中字符串是怎么存储的呢。 在go中,字符串是不可变的字节数组,其头部指针指向一个字节数组。
字符串内存分配
字符串默认在堆上分配内存存储。
- CSS魔法堂:小结一下Box Model与Positioning Scheme
- jboss EAP 6.2+ 通过代码控制JNDI数据源
- jboss CLI 命令行接口学习(适用JBOSS EAP 6.2+)
- WebComponent魔法堂:深究Custom Element 之 面向痛点编程
- 修复bootstrap daterangepicker中的3个问题
- 搭建AngualarJS开发环境
- CSS魔法堂:重拾Border之——更广阔的遐想
- Jboss EAP:native management API学习
- linux:手动校准系统时间和硬件CMOS时间
- CSS3魔法堂:说说Multi-column Layout
- 数据可视化-EChart2.0使用总结2
- rpc框架之 thrift 学习 2 - 基本概念
- rpc框架之avro 学习 1 - hello world
- 探讨Android中的内置浏览器和Chrome
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【漏洞修复】MongoDB未授权访问漏洞复现和修复
- 在 Istio 中实现 Redis 集群的数据分片、读写分离和流量镜像
- 实现Android 滑动退出Activity的功能
- Android开发中播放声音的两种方法分析
- Android UI设计与开发之实现应用程序只启动一次引导界面
- Android编程实现两点触控功能示例
- Android RecycleView添加head配置封装的实例
- Android编程实现捕获程序异常退出时的错误log信息功能详解
- Android开发之Socket通信传输简单示例
- Android自定义对话框Dialog的简单实现
- Android编程实现Toast只显示最后一条的方法
- Android 照相机的实例应用
- Android 逐帧动画创建实例详解
- 腾讯云 Severless 项目开发和灰度发布实践之路
- C/C++ Search Extension —— 一款可以快速在地址栏搜索 C/C++ 文档的浏览器插件