简介

字符串在各种编程语言中都是很基础的一种类型,在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-8UNICODE的一种变长度的编码表达方式,我们都知道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)

Gostring就是采用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字符串的更多相关文章

  1. Python web前端 08 字符串 数组 json

    Python web前端 08 字符串 数组 json 一.string #string 字符串 #索引 下标 偏移量 ---从0开始 str[index]; #通过索引取字符串 可读不可写 str. ...

  2. 我的Android进阶之旅------>Java字符串格式化方法String.format()格式化float型时小数点变成逗号问题

    今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.好吧,又是我来维护. 好吧,先把系统语言切换到波兰语,切换到波兰语的方法查看文章 我的And ...

  3. plsql programming 08 字符串

    一般, char 和 nchar 类型很少使用. 建议使用 varchar2 和 nvarchar2, 其中( n 开头的是国家字符集, 没有n开头的是数据库字符集 ) 一般也不怎么使用国家字符集 v ...

  4. leetcode刷题笔记08 字符串转整数 (atoi)

    题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...

  5. Java探索之旅(13)——字符串类String

    1.初始化 String类是Java预定义类,非基本类型而是引用类型. public class StudyString { public static void main(String[] args ...

  6. 我的Java开发学习之旅------>求字符串中出现次数最多的字符串以及出现的次数

    金山公司面试题:一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数 ...

  7. Go的100天之旅-常量

    常量 简介 道可道,非常道.这里常道指的永恒不变的道理,常有不变的意思.顾名思义和变量相比,常量在声明之后就不可改变,它的值是在编译期间就确定的. 下面简单的声明一个常量: const p int = ...

  8. Go的100天之旅-04基础数据类型

    基础数据类型 在变量的定义中,我们讲了每个变量是有类型的,类型在计算机中是用来约束数据的解释.Go语言和其它计算机语言一样,提供丰富了丰富的数据类型,我们就来看看到底有哪些类型,同时也可以比较一下它和 ...

  9. Go的100天之旅-03变量

    变量 变量介绍 变量这个词来源于数学,类似方程中的x.y,代表的是存储在计算机中的值.这里主要介绍Go和其它编程语言不一样的地方,在前面我们提到过,Go是一门静态语言.静态语言区别动态语言一个重要的特 ...

随机推荐

  1. 漏洞复现 MS11-003

    0x01漏洞简介 ms11-003(windows7IE溢出攻击) 是利用IE8中对css的解析存在一个问题,导致任何访问包含非法css的页面将导致IE8崩溃重启的漏洞. 0x02环境准备 攻击机:k ...

  2. C#多线程编程(一)进程与线程

    一. 进程 简单来说,进程是对资源的抽象,是资源的容器,在传统操作系统中,进程是资源分配的基本单位,而且是执行的基本单位,进程支持并发执行,因为每个进程有独立的数据,独立的堆栈空间.一个程序想要并发执 ...

  3. ElasticSearch中的sort排序和filedData作用

    默认情况下,ElasticSearch 会根据算分进行排序: 可以使用 sort API 指定排序的规则: POST /kibana_sample_data_ecommerce/_search { & ...

  4. JavaWeb网上图书商城完整项目--23.注册页面之html实现

    我们来分析下这个页面的代码如何实现: 我们来分下下层次结构: 1.首先最外层是一个大的div,然后又包括两个小的div,第一个div中包括一个span,第二个div是一个table表 我们来看程序的代 ...

  5. junit基本介绍视频笔记1

    程序员每天工作的基本流程: 1.从svn检出代码: 2.运行单元测试,测试无误,进入下一步: 3.开始一天的代码编写工作: 4.代码提交到服务器之前进行单元测试: 5.单元测试通过提交到svn服务器. ...

  6. 入门大数据---Hbase 过滤器详解

    一.HBase过滤器简介 Hbase 提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predic ...

  7. 双缓冲显示字幕(卡拉ok字幕)

    思路: 1.设置定时器SetTime,在Ontime()里面确定显示矩形的大小,让后用DrawText把字铁道矩形上面: 2. int nTextHei = dc.GetTextExtent( m_s ...

  8. java方法中开启一个线程

    很多业务场景下需要你在一个方法中去开启一个线程,去跑一些处理时间较长的代码,这样调用方就不必经过长时间的等待了.好了 话不多说  先上代码: package test; public class Th ...

  9. js实现简单的菜谱全选功能

    思路:全选按钮和子按钮分开考虑,当全选按钮选中的时候,也就是其checked为true的时候,所有的子按钮也全都为true,反之,则为false.子按钮的想法是,当点击某一个子按钮的时候,会看一下是否 ...

  10. 解读 java 并发队列 BlockingQueue

    点击添加图片描述(最多60个字)编辑 今天呢!灯塔君跟大家讲: 解读 java 并发队列 BlockingQueue 最近得空,想写篇文章好好说说 java 线程池问题,我相信很多人都一知半解的,包括 ...