+ 收藏我们

网站模板

网站模板搜索
404模板 营销型模板 外贸网站模板 单页模板 双语模板 标签大全
电话:18630701785
首页 > 站长学院 > Go语言 strings包NewReader方法及ReadRune查找字符串 >

Go语言 strings包NewReader方法及ReadRune查找字符串

时间:2024-04-11 09:43:54

一、函数说明
strings.NewReader创建一个从s读取数据的Reader

type Reader struct {
    s        string //对应的字符串
    i        int64  // 当前读取到的位置
    prevRune int   
}
// 读取器实了 io.Reader, io.ReaderAt, io.Seeker, io.WriterTo,
// io.ByteScanner, 和 io.RuneScanner 通过从字符串中读取
// Reader的零值类似于空字符串的读取器
type Reader struct {
    s        string // 对应的字符串
    i        int64 // 当前读取到的位置
    prevRune int   // prevRune索引; or < 0
}
二、相关方法
2.1 ReadByte
func (r *Reader) ReadByte() (byte, error)

ReadByte 从 r *Reader 中读出一个字节并返回
如果 r *Reader 中无可读数据,则返回一个错误
2.2 UnreadByte
func (r *Reader) UnreadByte() error

UnreadByte 撤消最后一次读出的字节
只有最后读出的字节可以被撤消
只要有内容被读出,就可以用 UnreadByte 撤消读出的一个字节
func (r *Reader) ReadByte() (byte, error)
代码示例:

    read := strings.NewReader("abcd")
    c, _ := read.ReadByte()
    fmt.Printf("%c\n", c) // a
    c, _ = read.ReadByte()
    fmt.Printf("%c\n", c) // b

    _ = read.UnreadByte()
    c, _ = read.ReadByte() // b
    fmt.Printf("%c\n", c)
2.3 ReadRune
方法说明:
func (r *Reader) ReadRune() (ch rune, size int, err error)

ReadRune 从 r *Reader 中读出一个 UTF8 编码的字符串并返回第一个参数 ch rune
同时返回该字符的 UTF8 编码长度,返回的第二个参数 size int,如果发生错误,第三个参数即错误 err error
如果 UTF8 序列无法解码出一个正确的 Unicode 字符,只读出 r *Reader 中的一个字节,并返回 ch = U+FFFD 字符,size = 1
2.4 UnreadRune
func (r *Reader) UnreadRune() error

UnreadRune 撤消最后一次读出的 Unicode 字符
如果最后一次执行的不是 ReadRune 操作,则返回一个错误
因此 UnreadRune 比 UnreadByte 更加严格
代码示例:

    reader := strings.NewReader("你好,世界!")
    s, size, _ := reader.ReadRune()
    fmt.Printf("%c %v \n", s, size) // 你 3

    _ = reader.UnreadRune()
    s, size, _ = reader.ReadRune()
    fmt.Printf("%c %v \n", s, size) // 你 3
三、查询UTF-8字符位置
实现类似于 PHP 的 mb_strpos 函数:

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(mb_strpos("聚合数据科技公司", "科技")) // 4
    fmt.Println(mb_strpos("聚合数据--科技公司", "科技")) // 6
    fmt.Println(mb_strpos("juhe聚合数据-科技公司", "数据")) // 6
}

func mb_strpos(haystack, needle string) int {
    index := strings.Index(haystack, needle)
    if index == -1 || index == 0 {
        return index
    }
    pos := 0
    total := 0
    reader := strings.NewReader(haystack)
    for {
        _, size, err := reader.ReadRune()
        if err != nil {
            return -1
        }
        total += size
        pos++
        // Got it
        if total == index {
            return pos
        }
    }
}

有问题可以加入网站技术QQ群一起交流学习

本站会员学习、解决问题QQ群(691961965)

客服微信号:lpf010888

Title