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是一门静态语言.静态语言区别动态语言一个重要的特 ...
随机推荐
- vue 深度拷贝 除去空的参数
// 去除数组里面为空的属性及子数组 export function deepCopy (source) { var result = [] //var result = {} for (var ke ...
- skywalking的核心概念
在 SkyWalking 中,TraceSegment 是一个介于 Trace 与 Span 之间的概念,它是一条 Trace 的一段,可以包含多个 Span.在微服务架构中,一个请求基本都会涉及跨进 ...
- 半导体质量管理_eCAP LineWorks SPACE eCAP(电子OCAP)
用于设计和实施纠正措施的自动化工作流程 以电子方式管理纠正措施的工作流程 LineWorks SPACE的此附加程序提供了设计和自动实施纠正措施(电子纠正措施计划,eCAP)的工作流程.这样可以确保您 ...
- 发家致富的鬼bug。让人心动
这个bug是我目前见过最离谱的bug…… 颠覆了我二十多年的世界观,天上掉馅饼这种好事第一次砸我身上(雾),至今我都没想明白其中的原理. 情况是这样的,去年我出门去外地有些事情要处理.由于要呆很长时间 ...
- redis-cli连接redis服务器操作
安装redis-cli 命令:redis-cli -h 地址 -p 端口号 认证:auth 密码 选择对应的DB:Select DB号(0~15) 查看对应的Key的过期时间:TTL Key名称 查看 ...
- 解决只能通过localhost访问Elasticsearch的问题
解决只能通过localhost访问Elasticsearch的问题 在默认情况下Elasticsearch是无法通过外网访问的 需要绑定地址,原因如下: 具体方法为: vim /opt/es/ ...
- 前端分页(js)
//前端分页 var limit = 10; //每页显示数据条数 var total = $('#host_table').find('tr').length; var allPage = tota ...
- KMP入门
First.先上一份最原始的无任何优化的代码(暴力): #include <iostream> #include <cstring> using namespace std; ...
- BJDCTF-2020-WRITEUP---TiKi小组
title: BJDCTF 2020 刷题记录categories: CTFtags: BJDCTF CTF2020 BJDCTF Web duangShell 根据提示,输入.index.php.s ...
- 读《大话设计模式》——应用策略模式的"商场收银系统"(WinForm)
策略模式的结构 这个模式涉及到三个角色: 环境(Context)角色:持有一个 Strategy 类的引用.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现.此角色给出所 ...