指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub

今天在看go的一个源码的时候,看到了rune,所以就想看看它的使用场景。 官网说 rune 是 int32的别名 下面通过一个案例说明问题:

package test

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

func TestRune(t *testing.T) {
	var str = "hello 中国"

	//golang中string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8。
	fmt.Println("len(str):", len(str))//输出 12


	//如果我们预期想得到一个字符串的长度,而不是字符串底层占得字节长度,那就可以通过rune实现
	//通过utf8的RuneCountInString方法处理
	fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))//输出8
	//通过rune类型处理
	fmt.Println("rune:", len([]rune(str)))//输出8


	//for-range循环,输出结果如下
	//k1= 0 v1= h
	//k1= 1 v1= e
	//k1= 2 v1= l
	//k1= 3 v1= l
	//k1= 4 v1= o
	//k1= 5 v1=
	//k1= 6 v1= 中
	//k1= 9 v1= 国 //这里索引自动 +3

	//k2= 0 v2= h
	//k2= 1 v2= e
	//k2= 2 v2= l
	//k2= 3 v2= l
	//k2= 4 v2= o
	//k2= 5 v2=
	//k2= 6 v2= 中
	//k2= 7 v2= 国 //索引递增
	//--- PASS: TestRune (0.00s)
	//PASS
	s1 := "hello 中国"

	for k, v := range s1 {
		fmt.Println("k1=", k, "v1=", string(v))
	}

	fmt.Println("")
	for k, v := range []rune(s1) {
		fmt.Println("k2=", k, "v2=", string(v))
	}

	//rune 等同于int32,常用来处理unicode或utf-8字符
}