Go的100天之旅-08字符串
简介
字符串在各种编程语言中都是很基础的一种类型,在Go中字符串简单理解就是一个数组,数组里面的元素是byte类型。因此基本上拥有类似数组的全部特性。例如len可以返回字符串的字节数,注意不是字符的长度:
s := "go"
fmt.Println(len(s)) //2
也可以根据下标访问该位置的字节
s := "go"
fmt.Println(s[0]) //103 字符g的ASCII码
字符串也可以类似切片的操作,取其给定范围内的字符串,生成一个新的字符
s := "hello world"
fmt.Println(s[0:5]) // "hello"
fmt.Println(s[:5]) // "hello"
fmt.Println(s[:]) // "hello world"
也可以用+操作符,把两个字符串连接成一个新的字符串
s := "hello"
w := "world"
s = s + w //"hello world"
刚开始的时候我们说过,字符串是不可变,这段代码中最后的s是一段新的字符串。而不是在开始s基础上修改的。同时先要做类似数组那样修改元素的值也是不可以的
s := "hello"
s[1] = 't' //编译时会报错
UTF-8字符
UTF-8是UNICODE的一种变长度的编码表达方式,我们都知道ASCII编码是1个字节,但是这也限制了它只能代表128个字符,无非对其它语言的字符进行编码。如果把所有的字符都用统一用32位表示,的确比较简单,但是这样会浪费很多空间,而且历史上的ASCII编码的字符也无兼容。UTF-8采用1-4个字节表示字符,ASCII还是只用1个字节,保持兼容。如果第一个字节的是110开头,则需要2个字节。1110开头则需要3个字节,11110开头则是4个字节。
0xxxxxxx runes 0-127 (ASCII)
110xxxxx 10xxxxxx 128-2047 (values <128 unused)
1110xxxx 10xxxxxx 10xxxxxx 2048-65535 (values <2048 unused)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 65536-0x10ffff (other values unused)
Go的string就是采用UTF-8编码,因此无法直接通过下标i直接访问第i个字符,比如:
s := "你好世界"
fmt.Println(len(s)) //15
上面这段代码运行返回长度是12,如果想要知道有多少个字符可以利用unicode/utf8提供的功能来获取:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s := "你好世界!"
fmt.Println(len(s)) //15
fmt.Println(utf8.RuneCountInString(s)) //5
}
想要分割成单个字符输出可以通过for range:
func main() {
s := "你好世界!"
for i, r := range s {
fmt.Printf("%d\t%q\t%d\n", i, r, r)
}
}
//返回
0 '你' 20320
3 '好' 22909
6 '世' 19990
9 '界' 30028
12 '!' 65281
这次遍历都是单个字符的遍历,而不是单个字节。
字符串的常用操作
Go 的标准库提供了丰富的工具,对字符串进行操作,下面简单介绍下常见的操作:
package main
import (
"fmt"
"strings"
)
func main() {
s := "hello"
fmt.Println(strings.Contains(s, "he")) //true 是否包含子字符串
fmt.Println(strings.Replace(s, "he", "eh", 1)) // ehllo 替换第一个
bytes := []byte(s) //转化为byte数组
s2 := string(bytes)//byte数组转化为字符串
fmt.Println(s2)
}
字符串和数字之间的转化也是经常用到的,strconv里面提供的丰富的功能让它们互相转化
import (
"fmt"
"strconv"
)
func main() {
s := "123"
i, _:= strconv.Atoi(s) //字符串转化为数字
fmt.Println(i+2) //125
x := 123
var a string = strconv.Itoa(x) //数字转化为字符串
fmt.Println(a) //123
}
如果想要动态的增加字符串Go提供了Buffer类型可以动态的增加字符:
package main
import (
"fmt"
"bytes"
)
func main() {
var buf bytes.Buffer
buf.WriteString("s")
fmt.Println(buf.String()) //s
buf.WriteByte('A')
fmt.Println(buf.String()) //sA
}
Go的100天之旅-08字符串的更多相关文章
- Python web前端 08 字符串 数组 json
Python web前端 08 字符串 数组 json 一.string #string 字符串 #索引 下标 偏移量 ---从0开始 str[index]; #通过索引取字符串 可读不可写 str. ...
- 我的Android进阶之旅------>Java字符串格式化方法String.format()格式化float型时小数点变成逗号问题
今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.好吧,又是我来维护. 好吧,先把系统语言切换到波兰语,切换到波兰语的方法查看文章 我的And ...
- plsql programming 08 字符串
一般, char 和 nchar 类型很少使用. 建议使用 varchar2 和 nvarchar2, 其中( n 开头的是国家字符集, 没有n开头的是数据库字符集 ) 一般也不怎么使用国家字符集 v ...
- leetcode刷题笔记08 字符串转整数 (atoi)
题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...
- Java探索之旅(13)——字符串类String
1.初始化 String类是Java预定义类,非基本类型而是引用类型. public class StudyString { public static void main(String[] args ...
- 我的Java开发学习之旅------>求字符串中出现次数最多的字符串以及出现的次数
金山公司面试题:一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数 ...
- Go的100天之旅-常量
常量 简介 道可道,非常道.这里常道指的永恒不变的道理,常有不变的意思.顾名思义和变量相比,常量在声明之后就不可改变,它的值是在编译期间就确定的. 下面简单的声明一个常量: const p int = ...
- Go的100天之旅-04基础数据类型
基础数据类型 在变量的定义中,我们讲了每个变量是有类型的,类型在计算机中是用来约束数据的解释.Go语言和其它计算机语言一样,提供丰富了丰富的数据类型,我们就来看看到底有哪些类型,同时也可以比较一下它和 ...
- Go的100天之旅-03变量
变量 变量介绍 变量这个词来源于数学,类似方程中的x.y,代表的是存储在计算机中的值.这里主要介绍Go和其它编程语言不一样的地方,在前面我们提到过,Go是一门静态语言.静态语言区别动态语言一个重要的特 ...
随机推荐
- Redis源码阅读一:简单动态字符串SDS
源码阅读基于Redis4.0.9 SDS介绍 redis 127.0.0.1:6379> SET dbname redis OK redis 127.0.0.1:6379> GET dbn ...
- 490. The Maze
原题链接:https://leetcode.com/articles/the-maze/ 这道题目是需要冲会员才能使用的,然而我个穷逼现在还是失业状态根本冲不起...以后如果把免费题目都刷完了的话,再 ...
- js的原型和原型链
总结: 1.每一个函数都有一个prototype属性,默认指向object空对象(原型对象), 每一个原型对象都有一个constructor属性,指向函数对象. eg: Person函数: P ...
- Java开发中的23种设计模式详解(收藏-转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 【解读】TCP协议
本文内容如下: 1)TCP协议概念 2)TCP头部结构和字段介绍 3)TCP流量控制 滑动窗口 4)TCP拥塞控制 慢 ...
- android handle详解2 主线程给子线程发送消息
按照android handler详解分析的原理我们可以知道,在主线程中创建handle对象的时候,主线程默认创建了一个loop对象使用threalocal函数将loop对象和主线程绑定. 我们能不能 ...
- web之robots.txt
什么是roots协议 robots协议也叫robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被 ...
- openstack Rocky 社区版部署1.4 安装数据库
在控制节点安装mariadb,也可以单独服务器安装数据库,假如多个控制节点就在第一台安装数据库,计算节点不需要安装. 1 安装mariadb相关安装包. yum install mariadb mar ...
- 洛谷P3694 邦邦的大合唱站队【状压dp】
状压dp 应用思想,找准状态,多考虑状态和\(f\)答案数组的维数(这个题主要就是找出来状态如何转移) 题目背景 \(BanG Dream!\)里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. ...
- 循环&&数组&&方法&&面向对象
day03 数值的默认值 类型 初始化的值 byte,short,int,long 0 float,double 0.0 char 空格 boolean false 引用类型 null JVM的内存 ...