go标准库的学习-strings-字符串操作
参考https://studygolang.com/pkgdoc
导入方式:
import "strings"
strings包实现了用于操作字符的简单函数。
常用的几个函数:
func Contains
func Contains(s, substr string) bool
判断字符串s是否包含子串substr。
举例:
package main
import(
"fmt"
"strings" ) func main() {
fmt.Println(strings.Contains("seafood", "foo")) //true
fmt.Println(strings.Contains("seafood", "bar")) //false
fmt.Println(strings.Contains("seafood", "")) //true
fmt.Println(strings.Contains("", "")) //true
}
func Index
func Index(s, sep string) int
子串sep在字符串s中第一次出现的位置,不存在则返回-1。
举例:
package main
import(
"fmt"
"strings" ) func main() {
fmt.Println(strings.Index("chicken", "ken")) //
fmt.Println(strings.Index("chicken", "dmr")) //-1
}
func Join
func Join(a []string, sep string) string
将一系列字符串连接为一个字符串,之间用sep来分隔。
举例:
package main
import(
"fmt"
"strings" ) func main() {
s := []string{"foo", "bar", "baz"}
fmt.Println(strings.Join(s, ", "))//foo, bar, baz
}
func Repeat
func Repeat(s string, count int) string
返回count个s串联的字符串。
举例:
package main
import(
"fmt"
"strings" ) func main() {
fmt.Println("ba" + strings.Repeat("na", )) //banana
}
func Replace
func Replace(s, old, new string, n int) string
返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换所有old子串。
举例:
package main
import(
"fmt"
"strings" ) func main() {
fmt.Println(strings.Replace("oink oink oink", "k", "ky", )) //oinky oinky oink
fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -)) //moo moo moo
}
func Split
func Split(s, sep string) []string
用去掉s中出现的sep的方式进行分割,会分割到结尾,并返回生成的所有片段组成的切片(每一个sep都会进行一次切割,即使两个sep相邻,也会进行两次切割)。如果sep为空字符,Split会将s切分成每一个unicode码值一个字符串。
举例:
package main
import(
"fmt"
"strings" ) func main() {
fmt.Printf("%q\n", strings.Split("a,b,c", ",")) //["a" "b" "c"]
fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a ")) //["" "man " "plan " "canal panama"]
fmt.Printf("%q\n", strings.Split(" xyz ", "")) //[" " "x" "y" "z" " "]
fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins")) //[""]
}
func Trim
func Trim(s string, cutset string) string
返回将s前后端所有cutset包含的utf-8码值都去掉的字符串。
举例:
package main
import(
"fmt"
"strings" ) func main() {
fmt.Printf("[%q]\n", strings.Trim(" !!! Achtung! Achtung! !!! ", "! ")) //["Achtung! Achtung"]
}
func Fields
func Fields(s string) []string
返回将字符串按照空白(unicode.IsSpace确定,可以是一到多个连续的空白字符)分割的多个字符串。如果字符串全部是空白或者是空字符串的话,会返回空切片。
举例:
package main
import(
"fmt"
"strings" ) func main() {
fmt.Printf("Fields are: %q\n", strings.Fields(" foo bar baz ")) //Fields are: ["foo" "bar" "baz"]
}
)type Reader
type Reader struct {
s string
i int64 // current reading index
prevRune int // index of previous rune; or < 0
Reader类型通过从一个字符串读取数据,实现了io.Reader、io.Seeker、io.ReaderAt、io.WriterTo、io.ByteScanner、io.RuneScanner接口。
实现源码:
1> func NewReader
func NewReader(s string) *Reader
NewReader创建一个从s读取数据的Reader。本函数类似bytes.NewBufferString,但是更有效率,且为只读的。
该初始化源码:
func NewReader(s string) *Reader { return &Reader{s, 0, -1} }
举例:
package main
import(
"fmt"
"io"
"strings"
"os"
)
func main() {
reader := strings.NewReader("test reader's usage")
buf := make([]byte, 4) //生成一个能够存放4 bytes数据的数组
for {//无限循环直至有错或数据读取完返回EOF
count, err := reader.Read(buf)//后面读取的内容会覆盖前面的buf的内容
if err != nil {
if err == io.EOF {
fmt.Println("EOF : ", count)
break
}
fmt.Println(err)
os.Exit(1)
}
fmt.Println(count, string(buf[:count]))
}
}
返回:
userdeMBP:src user$ go run test.go
4 test
4 rea
4 der'
4 s us
3 age
EOF :
2》func (*Reader) Len
func (r *Reader) Len() int
Len返回r包含的字符串还没有被读取的部分,即当前文件指针之后的内容
3》func (*Reader) Read
func (r *Reader) Read(b []byte) (n int, err error)
4》func (*Reader) ReadByte
func (r *Reader) ReadByte() (b byte, err error)
5》func (*Reader) UnreadByte
func (r *Reader) UnreadByte() error
6》func (*Reader) ReadRune
func (r *Reader) ReadRune() (ch rune, size int, err error)
7》func (*Reader) UnreadRune
func (r *Reader) UnreadRune() error
8》func (*Reader) ReadAt
func (r *Reader) ReadAt(b []byte, off int64) (n int, err error)
9》func (*Reader) WriteTo
func (r *Reader) WriteTo(w io.Writer) (n int64, err error)
WriteTo实现了io.WriterTo接口。
举例:
package main
import(
"fmt"
"strings"
"log"
"os"
)
func main() {
fmt.Println("1 - test Read")
reader := strings.NewReader("test strings's NewReader() and the usage of its function\n")
len := reader.Len()
fmt.Printf("1 before - the length of the part have not beed read : %d\n", len)
data := make([]byte, 8)
number, err := reader.Read(data)
if err != nil {
log.Fatal(err)
}
len = reader.Len()
fmt.Printf("1 after - the length of the part have not beed read : %d\n", len)
fmt.Println(string(data[:number])) fmt.Println("2 - test ReadByte")
for i := 0; i < 3; i++ {
readbyte, err := reader.ReadByte()//从当前文件指针向后读取一个byte的内容
if err != nil {
log.Fatal(err)
}
fmt.Print(readbyte, " ")
}
fmt.Println() len = reader.Len()
fmt.Printf("2 after - the length of the part have not beed read : %d\n", len) fmt.Println("3 - test UnreadByte") //就相当于撤销之前的一次ReadByte()操作,文件指针向前移一位
err = reader.UnreadByte()
if err != nil {
log.Fatal(err)
} len = reader.Len()
fmt.Printf("3 after - the length of the part have not beed read : %d\n", len) fmt.Println("4 - test ReadAt")
number1, err := reader.ReadAt(data, 11)
if err != nil {
log.Fatal(err)
}
len = reader.Len()
fmt.Printf("4 after - the length of the part have not beed read : %d\n", len)
fmt.Println(string(data[:number1])) fmt.Println("5 - test ReadRune")
for i := 0; i < 3; i++ {
readrune, _, err := reader.ReadRune()//从当前文件指针向后读取一个rune的内容
if err != nil {
log.Fatal(err)
}
fmt.Print(readrune, " ")
// fmt.Print(readrune)
}
fmt.Println() len = reader.Len()
fmt.Printf("5 after - the length of the part have not beed read : %d\n", len) fmt.Println("6 - test UnreadRune")
err = reader.UnreadRune() //就相当于撤销之前的一次ReadByte()操作,文件指针向前移一位
if err != nil {
log.Fatal(err)
}
len = reader.Len()
fmt.Printf("6 after - the length of the part have not beed read : %d\n", len) fmt.Println("test WriterTo")
number3, err := reader.WriteTo(os.Stdout)//从当前指针开始将文件内容输出到os.Stdout,即标准输出中
if err != nil {
log.Fatal(err)
}
fmt.Println(number3)
}
返回:
userdeMBP:src user$ go run test.go
1 - test Read
1 before - the length of the part have not beed read : 57
1 after - the length of the part have not beed read : 49
test str
2 - test ReadByte
105 110 103 //即ing
2 after - the length of the part have not beed read : 46
3 - test UnreadByte
3 after - the length of the part have not beed read : 47
4 - test ReadAt
4 after - the length of the part have not beed read : 47
s's NewR
5 - test ReadRune
103 115 39 //即gs'
5 after - the length of the part have not beed read : 44
6 - test UnreadRune
6 after - the length of the part have not beed read : 45
test WriterTo
's NewReader() and the usage of its function
未完待续
go标准库的学习-strings-字符串操作的更多相关文章
- Python3标准库:string通用字符串操作
1. string:通用字符串操作 string模块在很早的Python版本中就有了.以前这个模块中提供的很多函数已经移植为str对象的方法,不过这个模块仍保留了很多有用的常量和类来处理str对象. ...
- go标准库的学习-net/http
参考:https://studygolang.com/pkgdoc 概念解释: request:用户请求的信息,用来解析用户的请求信息,包括post.get.cookie.url等信息 respons ...
- go标准库的学习-database/sql
参考:https://studygolang.com/pkgdoc 导入方式: import "database/sql" sql包提供了保证SQL或类SQL数据库的泛用接口. 使 ...
- go标准库的学习-crypto/md5
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/md5" md5包实现了MD5哈希算法,参见RFC 1321. Con ...
- go标准库的学习-crypto/sha1
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha1" sha1包实现了SHA1哈希算法,参见RFC 3174. ...
- go标准库的学习-crypto/sha256
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha256" sha256包实现了SHA224和SHA256哈希算法 ...
- go标准库的学习-path/filepath
参考https://studygolang.com/pkgdoc 标准库path中有的该path/filepath库中都有,所以一般都使用path/filepath 导入方式: import &quo ...
- go标准库的学习-io
参考https://studygolang.com/pkgdoc 导入方式: import "io" o包提供了对I/O原语的基本接口.本包的基本任务是包装这些原语已有的实现(如o ...
- go标准库的学习-bufio
参考https://studygolang.com/pkgdoc 导入方式: import "bufio" bufio包实现了有缓冲的I/O.它包装一个io.Reader或io.W ...
- python 标准库基础学习之开发工具部分1学习
#2个标准库模块放一起学习,这样减少占用地方和空间#标准库之compileall字节编译源文件import compileall,re,sys#作用是查找到python文件,并把它们编译成字节码表示, ...
随机推荐
- JavaScript类继承
和其他功能一样,ECMAScript 实现继承的方式不止一种.这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的.这意味着所有的继承细节并非完全由解释程序处理.作为开发者 ...
- JDK源码解析之Java SPI机制
1. spi 是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件. 系统设计的各个抽象,往往 ...
- 虚拟机安装Linux Centos
1.准备工作: Linux系统: 可以去 https://www.centos.org/download/ 下载DVD ISO版 虚拟机 2.VMware配置 3.Linux系统安装 4.重启,安装成 ...
- C#设计模式--迭代器模式(学习Learning hard设计模式笔记)
/// <summary> /// 抽象聚合接口 /// </summary> public interface IListCollection { Iterator GetI ...
- 【读书笔记】iOS-处理内存警告
-(void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; } 在这里你需要释放掉所有占用了很大内存的对象,如果你忽略了这个警告, ...
- python之正则表达式及RE模块
正则表达式(匹配字符串)web界面正则匹配工具:http://tool.chinaz.com/regex/ 元字符 1 . 匹配除换行符之外的任意字符 2 \w 匹配数字字母下划线 3 \d 匹配数字 ...
- java集合类学习
以下基于jdk1.8 一. 集合类关系图 1. 接口关系图 2.集合中的类,(不包含线程安全的) 二.ArrayList 1.类定义 /** * 用“可伸缩数组”来实现List接口.实现了所有List ...
- Fiddler 使用fiddler发送捕获的请求及模拟服务器返回
使用fiddler发送捕获的请求及模拟服务器返回 by:授客 QQ:1033553122 1.做好相关监听及代理设置 略 2.发送捕获的请求 如图 3.模拟服务器返回 本例的一个目的是,根据服务器返回 ...
- Android事件总线(四)源码解析otto
前言 上一篇文章中讲到了otto的用法,这一篇我们来讲一下otto的源码.可能有人觉得otto过时了,但是通过源码我们学习的是高手设计otto时的设计理念,这种设计理念是不过时的. otto各个类的作 ...
- recovery 升级'@/cache/recovery/block.map' failed错误问题
随着android版本升级,升级包越来越大,当升级包无法存储在cache分区的时候,会把升级包下载到data分区,然后从data分区升级,最近从data分区加载升级包升级的时候,遇到了如下错误: [ ...