当前位置: 首页 > news >正文

Go 基础丨字符串 string

1. 底层

  • runtime/string.go

    type stringStruct struct {str unsafe.Pointer		// 指向底层 Byte 数组len int								// String 所占字节数
    }
    
  • reflect/value.go

    type StringHeader struct {Data uintptrLen  int
    }
    

2. 测试

	s_en := "hedonwang"s_cn := "王小佳"fmt.Println(unsafe.Sizeof(s_en)) //16fmt.Println(unsafe.Sizeof(s_cn)) //16s_en_sh := (*reflect.StringHeader)(unsafe.Pointer(&s_en))		//16s_cn_sh := (*reflect.StringHeader)(unsafe.Pointer(&s_cn))		//16fmt.Println(s_en_sh.Len)	//9fmt.Println(s_cn_sh.Len)	//9

Go 统一使用 UTF-8 编码。

  • Unicode 是一种统一的字符集,囊括了 159 种文字的 144679 个字符,14w 个字符至少需要 3 个字节表示,英文字母均排在前 128 个。
  • Unicode 每个字符都用 3 个字节来表示,如果字符排在前面,就造成了很多的浪费,于是就出现变长编码 UTF-8:
    • 128 个 US-ASCII 字符只需要 1 个字节编码
    • 西方常用字符需要 2 个字节编码
    • 其他字符需要 3 个字节编码,极少数需要 4 个字节编码

3. 访问

  • fori 去访问 str[i] 访问的是 byte[] 字节数组

    str := "王小佳hedonwang"
    for i := 0; i < len(str); i++ {fmt.Printf("%v ", str[i])
    }
    // 231 142 139 229 176 143 228 189 179 104 101 100 111 110 119 97 110 103
    
  • 访问字符需要用 for … range,即访问 rune[] 数组

    str := "王小佳hedonwang"
    for _, char := range str {fmt.Printf("%c ", char)
    }
    // 王 小 佳 h e d o n w a n g
    

4. 切分

  • 先转为 rune[] 切片,再进行切片切分

    s := string([]rune(s)[:3])
    

相关文章:

  • 【已解决】better-scroll在PC端如何开启鼠标滚动以及如何始终显示滚动条
  • Vim基础操作:常用命令、安装插件、在VS Code中使用Vim及解决Vim编辑键盘错乱
  • 北方高温来袭!动力煤却不涨反跌的原因分析
  • 分支结构相关
  • JEnv-for-Windows 详细使用
  • 关于ReactV18的页面跳转传参和接收
  • 【干货分享】25地学考研推免夏令营汇总表
  • SpringBoot 多种优雅的线程池配置与使用(异步执行函数,反射机制,动态识别参数,有返回值)
  • 2024年6月20日 (周四) 叶子游戏新闻
  • redis 缓存jwt令牌设置更新时间 BUG修复
  • 2021 hnust 湖科大 数据结构课堂实验代码及报告
  • Python 获取class_name win32gui
  • 太速科技-基于AD916X的直流至 12 GHz 矢量信号发生器 FMC子卡
  • Python使用策略模式实现绘图功能
  • GenICam标准(二)
  • [NodeJS] 关于Buffer
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Asm.js的简单介绍
  • CSS实用技巧干货
  • es6--symbol
  • Github访问慢解决办法
  • Java小白进阶笔记(3)-初级面向对象
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Xmanager 远程桌面 CentOS 7
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 数据结构java版之冒泡排序及优化
  • 王永庆:技术创新改变教育未来
  • 我从编程教室毕业
  • 一个JAVA程序员成长之路分享
  • 优化 Vue 项目编译文件大小
  • ​ubuntu下安装kvm虚拟机
  • # include “ “ 和 # include < >两者的区别
  • # Redis 入门到精通(七)-- redis 删除策略
  • #07【面试问题整理】嵌入式软件工程师
  • #pragam once 和 #ifndef 预编译头
  • #QT(一种朴素的计算器实现方法)
  • (+4)2.2UML建模图
  • (Ruby)Ubuntu12.04安装Rails环境
  • (补充)IDEA项目结构
  • (差分)胡桃爱原石
  • (正则)提取页面里的img标签
  • .Net - 类的介绍
  • .Net 6.0 处理跨域的方式
  • .Net Remoting常用部署结构
  • .NET 发展历程
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET的数据绑定
  • @Autowired和@Resource装配
  • @html.ActionLink的几种参数格式
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C#] 基于 Token 的鉴权与签名机制详解 接口对接鉴权 token、sign(a=1b=2c=3d=4)、Base64、参数加密、MD5
  • [C#基础知识系列]专题十七:深入理解动态类型