Go语言中的rune类型浅析

rune是Go语言中一种特殊的数据类型,它是int32的别名,几乎在所有方面等同于int32,用于区分字符值和整数值

 1 package main
 2
 3 import "fmt"
 4
 5 func main() {
 6
 7     var str = "hello 世界"
 8     fmt.Println("len(str):", len(str))
 9
10 }

这段代码的执行结果为:

len(str):12

从字符串字面值看len(str)的结果应该是8,但在Golang中string类型的底层是通过byte数组实现的,在unicode编码中,中文字符占两个字节,而在utf-8编码中,中文字符占三个字节而Golang的默认编码正是utf-8.

如果想要获得真实的字符串长度而不是其所占用字节数,有两种方法实现

方法一:

使用unicode/utf-8包中的RuneCountInString方法

str := "hello 世界"fmt.Println("RuneCountInString:", utf8.RuneCountInString(str))

方法二:

将字符串转换为rune类型的数组再计算长度

str := "hello 世界"fmt.Println("rune:", len([]rune(str)))

原文地址:https://www.cnblogs.com/goback20170622/p/10306781.html

时间: 2024-08-29 20:44:52

Go语言中的rune类型浅析的相关文章

c语言中long long类型的赋值

long long unsigned int num = 20140701092715; 在C语言中编译器会把没有小数的数值常量默认为整形,这条语句编译器会报警告: [[email protected] ~]# gcc -o test 1.c 1.c: In function ‘main’: 1.c:6: warning: integer constant is too large for ‘long’ type 为了标识是long long类型,处理方法:将20140701092715指定为l

C语言中的bool类型

C99中提供了一个头文件 <stdbool.h> 定义了bool代表_Bool,true代表1,false代表0.只要导入 stdbool.h ,就能非常方便的操作布尔类型了. 代码如下: 1 #include <stdio.h> 2 #include <stdbool.h> 3 4 int main(int argc, char **argv) 5 { 6 int n = 10; 7 int sum = 1; 8 bool flag = false; 9 int nu

Java语言中:float、double数据类型在内存中是如何存储的

引用参考 https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528 https://blog.csdn.net/yansmile1/article/details/70145416 java语言中,float类型数字在计算机中用4个字节(32位)来存储.double类型占用8个字节(64位). 从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储

Go语言中byte类型和rune类型(五)

本篇内容本来准备在上一篇写的,想了想还是拆开写. go语言中字符串需要使用用双引号,而单引号用来表示单个的字符,字符也是组成字符串的元素.go语言的字符有两种: uint8类型,或者叫 byte 型,代表了ASCII码的一个字符. rune类型,代表一个 UTF-8字符. ASCII编码是1个字节,而UTF-8是可变长的编码,当要表示中文等非ASCll编码的字符时,需要使用UTF-8编码来保证不会乱码. 举个例子,来遍历打印一个字符串,当使用byte类型时: func main() { str:

c语言中register类型的变量

C语言中: 一.register变量 关键字regiter请求编译器尽可能的将变量存在CPU的寄存器中.有以下几点注意的地方. register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度.但是,有些机器的寄存器也能存放浮点数. register变量可能不存放在内存中,所以不能用取址符运算符“ & ”. 只有局部变量和形参可以作为register变量,全局变量不行. 静态变量不能定义为register.

Java 语言中 Enum 类型的使用介绍

Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似.不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围. 举个例子来说明一下,如果希望为彩虹描绘出七种颜色,你可以在 Java 程序中通过常量定义方式来实现. 清单 1. 常量定义 Public static class RainbowColor { // 红橙黄绿青蓝紫七种颜

C语言中,double、long、unsigned、int、char类型数据所占字节数

C语言中,double.long.unsigned.int.char类型数据所占字节数和机器字长及编译器有关系: 所以,int,long int,short int的宽度都可能随编译器而异.但有几条铁定的原则(ANSI/ISO制订的): 1 sizeof(short int)<=sizeof(int) 2 sizeof(int)<=sizeof(long int) 3 short int至少应为16位(2字节) 4 long int至少应为32位. unsigned 是无符号的意思. 16位编

在C语言中,double long unsigned int char 类型数据所占字节数

在C语言中,double  long  unsigned  int  char  类型数据所占字节数和机器字长及编译器有关系:所以,int,long int,short int的宽度都可能随编译器而异.但有下面几条原则(ANSI/ISO制订的): 1 sizeof(short int)<=sizeof(int) 2 sizeof(int)<=sizeof(long int) 3 short int至少应为16位(2字节) 4 long int至少应为32位. unsigned 是无符号的意思.

浅析C语言中assert的用法(转)

原文地址:http://www.jb51.net/article/39685.htm 以下是对C语言中assert的使用方法进行了介绍,需要的朋友可以参考下. assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( int expression );assert的作用是先计算表达式expression,如果其值为假(即为0),那么它先向标准错误流stderr打印一条出错