golang 中获取字符串个数

golang 中获取字符串个数

在 golang 中不能直接用 len 函数来统计字符串长度,查看了下源码发现字符串是以 UTF-8 为格式存储的,说明 len 函数是取得包含 byte 的个数

// string is the set of all strings of 8-bit bytes, conventionally but not
// necessarily representing UTF-8-encoded text. A string may be empty, but
// not nil. Values of string type are immutable.

举个例子,”Hello, 世界“(因为,对比所以用了中文)

s := "Hello, 世界"
fmt.Println(len(s)) // 13
fmt.Println([]byte(s)) // [72 101 108 108 111 44 32 228 184 150 231 149 140]

既然是以 byte 存储的,那自然就想到了取 byte 的长度

- bytes.Count()
- strings.Count()
- 将字符串转换为 []runee 后调用 len 函数
- 使用 utf8.RuneCountInString() 
package main

import (
    "bytes"
    "fmt"
    "strings"
    "testing"
    "unicode/utf8"
)

/*
在 golang 中不能直接用 len 函数来统计字符串长度,查看了下源码发现字符串是以 UTF-8 为格式存储的,说明 len 函数是取得包含 byte 的个数

*/

func main() {

    s := "hello, 世界"
    fmt.Println(len(s))    // 13
    fmt.Println([]byte(s)) // [72 101 108 108 111 44 32 228 184 150 231 149 140]

    fmt.Print(f1(s))
}

func f1(s string) int {
    return bytes.Count([]byte(s), nil) - 1
}

func f2(s string) int {
    return strings.Count(s, "") - 1
}

func f3(s string) int {
    return len([]rune(s))
}

func f4(s string) int {
    return utf8.RuneCountInString(s)
}

var s = "Hello, 世界"

func Benchmark1(b *testing.B) {
    for i := 0; i < b.N; i++ {
        f1(s)
    }
}

func Benchmark2(b *testing.B) {
    for i := 0; i < b.N; i++ {
        f2(s)
    }
}

func Benchmark3(b *testing.B) {
    for i := 0; i < b.N; i++ {
        f3(s)
    }
}

func Benchmark4(b *testing.B) {
    for i := 0; i < b.N; i++ {
        f4(s)
    }
}

在 golang ldea配置中我没有看到 benchamark配置,总说包不对,在命令行中输入

go test stringCount_test.go -bench ".*" 

得到以下结果

Benchmark1-12           100000000               17.7 ns/op
Benchmark2-12           100000000               14.0 ns/op
Benchmark3-12           100000000               14.5 ns/op
Benchmark4-12           100000000               13.1 ns/op

最快的是utf8.RuneCountInString()

原文地址:https://www.cnblogs.com/zrds/p/11356334.html

时间: 2024-11-08 22:14:03

golang 中获取字符串个数的相关文章

golang中的字符串拼接

go语言中支持的字符串拼接的方法有很多种,这里就来罗列一下 常用的字符串拼接方法 1.最常用的方法肯定是 + 连接两个字符串.这与python类似,不过由于golang中的字符串是不可变的类型,因此用 + 连接会产生一个新的字符串对效率有影响. s1 := "字符串" s2 := "拼接" s3 := s1 + s2 fmt.Print(s3) //s3 = "打印字符串" 2.第二种方法使用sprintf函数,虽然不会像直接使用 + 那样产生临

ios 开发中获取字符串中重复的字符的rang

iOS 开发中经常会遇到处理字符串的问题,对于一个字符串经常会遇见里面包含重复的字符需要对重复的字符进行处理,下面的代码就是对重复字符进行处理的操作,具体代码如下所示: /** * 返回重复字符的location * * @param text 初始化的字符串 * @param findText 查找的字符 * * @return 返回重复字符的location */ - (NSMutableArray *)getRangeStr:(NSString *)text findText:(NSStr

javascript中获取字符串或数组中元素的索引

有些时候,我们需要知道一个字符串中字符的位置,或者一个数组中元素的位置,这是就需要对该变量进行迭代操作. 对于数组,有两个方法indexOf和findIndex() , 需要注意的是,findIndex是数组的方法,不适用于字符串 1 let arr = ['a' ,'b', 'c'] 2 let idx = arr.findIndex((item) => { 3 return item == 'b' 4 }) 5 console.log(arr.indexOf('c')); // 2 6 co

Shell脚本中计算字符串长度的5种方法及从文本获取某一行

有时在Linux操作系统中需要计算某个字符串的长度,通过查询资料整理了下目前Shell中获取字符串的长度的多种方法,在这里分享给大家,方法如下: 方法1: 使用wc -L命令wc -L可以获取到当前行的长度,因此对于单独行的字符串可以用这个简单的方法获取,另外wc -l则是获取当前字符串内容的行数. 代码如下: echo "abc" |wc -L 方法2: expr length string使用expr length可以获取string的长度 方法3: awk获取域的个数,但是如果大

jquery获取字符串中出现最多的数

//获取字符串中出现最多的数和它一共出现多少次 var str = 'asdfssaaasasasasaa'; //定义字符串 var json = {}; //定义数组用来存储每个字符元素所对应的个数 for (var i = 0; i < str.length; i++) { //遍历字符串中所有的元素 if (!json[str.charAt(i)]) { //判断当前元素是否已经在数组中存在 str.charAt(i)//当前元素 json[str.charAt(i)] = 1; //给

统计字符串中汉字的个数

字符串可以包括数字.字母.汉字或者其他字符.使用Charater类的isDigit()方法可以判断字符串中的某个字符是否为数字, 使用Character类的isLetter()方法可以判断字符串中的某个字符是否为字母. 本案例将介绍用"正则表达式"来判断字符串中的某个字符是否为汉字,并统计该字符串中汉字的数量. 关键技术: Java中提供Pattern用于正则表达式的编译方式,该类的静态方法matches()可以执行正则表达式的匹配.该方法的声明如下: public static bo

golang中struct成员变量的标签(Tag)说明和获取方式

在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容.形如: type User struct { UserId int `json:"user_id" bson:"user_id"` UserName string `json:"user_name" bson:"user_name"` } 这个小米点里的内容是用来干什么的呢? struct成员变量标签(Tag)说明 要比较详

js使用正则表达式获取字符串中特定的字符

需求:从124fddr323532${xxxasdsafxx}253${bnm}23354${abcd}233545xx54${666}233545xxxxx这类字符串中获取${}中的内容.注意${xxx}的个数是不确定的. 使用了match和exec两种方式实现,直接上代码(更推荐第二种): function getMatchedStrs (str) { var reg = /\$\{(.+?)\}/ var reg_g = /\$\{(.+?)\}/g var result = str.ma

获取字符串中某一个字段的数据,GetValueFromStr

gps数据格式为:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A* /********************************************************************** *版权所有 (C)2015, Wuyq. * *文件名称: GetValueFromStr.c *内容摘要:用于演示从gps数据字符串中获取相应的内容 *其它说明:无 *当前版本: V1.0 *作