golang -----------字符串(rune,string,type)

2023-05-16

一、内存布局

字符串在Go语言内存模型中用一个2字长的数据结构表示。它包含一个指向字符串存储数据的指针和一个长度数据。因为string类型是不可变的,对于多字符串共享同一个存储数据是安全的。切分操作str[i:j]会得到一个新的2字长结构,一个可能不同的但仍指向同一个字节序列(即上文说的存储数据)的指针和长度数据。这意味着字符串切分可以在不涉及内存分配或复制操作。这使得字符串切分的效率等同于传递下标。

例如:

func main() {
	s := "你好,22tcy2122tcy221212222" // UTF-8
	fmt.Println(len(s))    //结果:28

	//
	st := []rune(s)
	st1 := st[0:13]

	//下面两个地址一样
	fmt.Printf("%v\n",&st[0])    //结果:0xc04203e060
	fmt.Printf("%v\n",&st1[0])    //结果:0xc04203e060
}

二、字符串默认在堆上分配内存存储。字符串是通过char数组存储的,字符串是不可变的字节数组,其头部指针指向一个字节数组。

三、string在内存中的存储结构是长度固定的字节数组,也就是说是字符串是不可变的。当要修改字符串的时候,需要转换为[]byte,修改完成后再转换回来。但是不论怎么转换,都必须重新分配内存,并复制数据,通过加号拼接字符串,每次都必须重新分配内存。

优化1:

通过strings.join()进行拼接,它会统计所有参数的长度,并一次性完成内存的分配操作。

func main() {
	s := make([]string, 10)
	for i := 0; i < 3; i++ {
		s[i] = "tcy"
	}
	fmt.Println(strings.Join(s, "最棒"))//tcy最棒tcy最棒tcy最棒最棒最棒最棒最棒最棒最棒
}

 

优化2:

 

通过buffer进行组装拼接,使用buffer是优先创建一个缓冲区,然后向缓冲区中写入数据,类似Java中的StringBuffer

func main() {
	var b bytes.Buffer
	b.Grow(22)//缓存大小

	for i := 0; i < 22; i++ {
	b.WriteString("tcy")
	}

	fmt.Println(b.String())
	//tcytcytcytcytcytcytcytcytcytcytcytcytcytcytcytcytcytcytcytcytcytcy
}

 

四、实例:最长不重复子串,演示rune,string,type之间的关系

 

package main

import "fmt"

func nonRepeatingSubStr(s string) string{
	last := make(map[rune]int)   //该字符上一次出现的位置
	startTemp := 0               //距离当前下标不含重复字符的起始下标
	start := 0                    //当前最大不重复子串的起始下标
	maxLength := 0                //当前最大不重复子串的长度
	var res []rune                //存储rune子串

	//获取最长不重复子串的起始位置和长度(start,maxLength)
	st := []rune(s)              //这步很重要 见解释1
	for i,ch := range st{
		if lastI,ok := last[ch];  ok && lastI >= startTemp {
			startTemp = i
		}
		if i + 1 - startTemp >maxLength {
			maxLength = i+1 - startTemp
			start = startTemp
		}
		last[ch]=i
	}

	//拼装成字符串并返回
	var t,j int

	for j=start;j<start+maxLength;j++{
		temp := st[j]
		res = append(res,temp)
		t++
	}
	result := string(res)
	return result

}

func main() {
	fmt.Println(
		nonRepeatingSubStr("tcytcytcy1"))
	fmt.Println(
		nonRepeatingSubStr("ttttt"))
	fmt.Println(
		nonRepeatingSubStr("2221_22_23"))
	fmt.Println(
		nonRepeatingSubStr(""))
	fmt.Println(
		nonRepeatingSubStr("2"))
	fmt.Println(
		nonRepeatingSubStr("你好,tcy"))
	fmt.Println(
		nonRepeatingSubStr(
			"世界很大,出去看看"))
}

解释一:(rune,string,type)

1、type 占一个字节

2、rune 英文占一个字节,中文占三个字节

3、string底层是用byte数组存的,并且是不可以改变的。 

4、在 Go 中,字符串是以 UTF-8 为格式进行存储的,在字符串上调用 len 函数,取得的是字符串包含的 byte 的个数

例如 s:="你好"  fmt.Println(len(s))  输出结果应该是6,因为中文字符是用3个字节存的。
 

所以用string存储unicode的话,如果有中文,按下标是访问不到,如果想要获得我们想要的情况的话,需要先转换为rune切片再使用内置的len函数

func main() {
	s := "你好" // UTF-8
	fmt.Println(len(s))    //结果:6

	//
	st := []rune(s)
	fmt.Println(len(st))    //结果:2
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang -----------字符串(rune,string,type) 的相关文章

  • Linux——常用命令汇总(man,date,cal,bc,重定向,cmp,Diff)

    man命令 xff08 查阅联机帮助文档 xff09 例如 man 1 sleep man 3 sleep date命令 xff08 读取系统日期和时间 xff09 cal命令 xff08 打印日历 xff09 bc命令 xff08 计算器
  • ubuntu 开机启动顺序配置(包括选择ubuntu内核)

    sudo gedit etc default grub 编辑grub配置文件 GRUB DEFAULT改为0 为默认以第一个启动 若想选择ubuntu内核 可以通过 GRUB DEFAULT 61 34 1 gt 2 34 选择第二个内核
  • C++出现“field has incomplete type“问题的解决

    出现错误的原因一般类似下面这种代码 xff1a span class token keyword struct span span class token class name Data span span class token punc
  • java 容器都有哪些?

    容器可以说是Java Core中比较重要的一部分了 数组 String java util下的集合容器 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 树莓派3B+ 镜像烧录以及环境设置

    写在前面的话 xff1a 没啥好说的 相关软件下载 xff1a xff08 SD卡格式化工具 win32diskimager Raspbian系统镜像 Xshell ssh工具 xff09 xff09 链接 xff1a https pan
  • 串口调试助手

    一 前言 串口操作流程 xff1a 步骤一 xff1a 设置串口参数 xff0c 如 xff1a 波特率 xff0c 数据位 xff0c 奇偶校验 xff0c 停止位 xff0c 数据流控制等 步骤二 xff1a 选择串口 xff0c 如w
  • 【51单片机】INT0及INT1中断计数

    前言 刚刚本着负责任的心 xff0c 把上次的博客补全 xff08 真的有点长 xff0c 不过都是干货 xff09 xff0c 再回来的时候本次编辑就消失了 xff0c 下次记得保存线上草稿 友情链接 xff1a xff11 51单片机实
  • How To Install and Configure VNC Server on Ubuntu 20.04

    From https tecadmin net install vnc server on ubuntu 20 04 text 61 1 20How 20To 20Install 20and 20Configure 20VNC 20Serv
  • putty+Xming在客户端显示服务器的图形程序界面

    Xming是一个在 Microsoft Windows 操作系统上运行 X Window System 的自由软件 下载地址 xff1a https sourceforge net projects xming Putty的使用方法之前总结
  • C++中的头文件(.h)和源文件(.cpp)都应该写什么?

    头文件 h xff1a 写定义和声明 写类的声明 xff08 包括类里面的成员和方法的声明 xff09 函数原型 define常数等 xff0c 但是一般来说不写具体的实现 注意 xff1a 1 在写头文件的时候需要注意 xff0c 在开头
  • heroku命令整理

    access 管理用户对应用的访问 addons 用于开发 xff0c 扩展和操作您的应用程序的工具和服务 apps 管理应用 auth heroku 认证 authorizations OAuth 认证 buildpacks 管理应用程序
  • 解决com.google.code.kaptcha 从maven中央仓库无法下载的解决方案

    1 首先下载源码包 xff1a http code google com p kaptcha downloads list 2 将解压后的文件中kaptcha version jar kaptcha 3 2 2 jar copy出来放到其他
  • ubuntu16.04创建普通用户、ssh连接

    0 环境 ubuntu16 04 mobaXterm 1 创建用户 创建用户 xff0c 只需要一个命令就可以了 xff1a adduser your username 例子 xff1a adduser yumo passwd your u
  • 【数据清洗】图像数据清洗之---去除相似度高的图像

    目的 xff1a 人工做数据清洗较为麻烦 xff0c 而且费事费力没成绩 xff0c 还拉拽整个项目的后腿 所以这里根据调研情况 xff0c 分析尝试一下 1 调研分析 1 百度EasyData 参考 xff1a 百度大脑自己的csdn说明
  • pip 命令,向指定的python环境中安装包

    在linux中 xff0c 进入anaconda的虚拟环境之后 xff0c 使用pip并不一定会安装在当前环境下 xff08 和windows不太一样 xff09 xff0c 而是安装在该pip对应的python版本里 xff0c pip对
  • 快速区分主键与外键

    主键与外键的区分 主键用来唯一标识一条记录 xff0c 不允许有重复 xff0c 不允许为空 作用 xff1a 用来保证数据的完整性 个数 xff1a only one 外键 xff0c 表的外键是另一个表的主键 xff0c 外键可以有重复
  • module.exports和exports、export和export default、require和import的详解

    一 分类 commonJS xff1a 导出 xff08 module exports和exports xff09 导入 xff08 require xff09 ES6 xff1a 导出 xff08 export和export defaul
  • 如何查看静态编译的依赖(所链接的库)

    如何查看静态编译的依赖 实际上 静态库不存在依赖 依赖是动态编译下被动态链接的库 可以使用ldd查看 静态链接的话 所有需要的静态库会被添加到文件中 库名在连接的过程中会被剥除 如果文件包含debug 信息 可以通过查看符号的方式 对比静态
  • Hadoop URL读取数据

    URL setURLStreamHandlerFactory 每个虚拟机只能调用一次这个方法 xff0c 因此通常在静态中调用这个方法 xff01 这个限制以为着如果程序其他的组件已经声明一个实例 xff0c 则将无法使用这个方法读取 1
  • 【随记】Mac 取消系统更新的红点

    1 打开 系统偏好设置 点击 软件更新 2 取消选择 自动保持我的Mac最新 3 然后点击 高级 按钮 xff0c 取消所有的勾选 4 通过上面步骤设置后 xff0c 发现底部的小红点还在 xff0c 则需打开终端 xff0c 执行如下2段

随机推荐

  • Android InputChannel事件发送接收系统分析

    本文基于Android12 InputChannel表示其他进程通过文件描述符传递输入事件到View的通道 xff0c 因为需要跨进程传输 xff0c 实现了Parcelable序列化接口 xff0c 所以也能够理解Java层的InputC
  • Homestead for Windows

    Homestead Windows Laravel 致力于让整个 PHP 开发体验变得愉快 xff0c 包括你的本地开发环境 Vagrant 提供了一种简单 xff0c 优雅的方式来管理和配置虚拟机 Laravel Homestead 是一
  • 因为你,我愿意

    偶然成就必然 xff0c 纵一现昙花 xff0c 亦可夺人眼眸 顺水推舟好过机缘巧合 xff0c 谨以此献给程序员未来展望 者 题记 每逢六月初 xff0c 总有人会这般调侃自己 就要高考了 xff0c 还没准备好 xff0c 好紧张 xf
  • 论文阅读笔记《Joint Graph Learning and Matching for Semantic Feature Correspondence》

    核心思想 本文提出一种联合图学习和图匹配的算法 xff08 GLAM xff09 xff0c 将图的构建和匹配过程整合到一个端到端的注意力网络中 相比于其他启发式的建图方法 xff0c 如Delaunay三角法 KNN方法或完全图 xff0
  • 为了安装caffe 安装opencv

    cmake D CMAKE BUILD TYPE 61 RELEASE D CMAKE INSTALL PREFIX 61 home lab248 anaconda2 D INSTALL PYTHON EXAMPLES 61 ON D IN
  • 腾讯轻量云服务器控制台详细介绍及建站操作图文教程

    腾讯轻量应用服务器控制台与腾讯云服务器不同 xff0c 轻量应用服务器主要是在控制台上集成了大部分建站功能 xff0c 通过简单点击几次鼠标就可以轻松建站 xff0c 易学易用 不过对于没接触过的新手来说 xff0c 还是有点陌生的 xff
  • 腾讯云轻量应用服务器快速搭建一个专属网盘

    一 前言 xff1a 云盘我想大家接触的一定不会少 云盘很好地解决了文件存储和共享的问题 xff0c 但随着大量云盘厂商的退出 xff0c 剩余的云盘服务也越来越少 有些云盘虽然上传速度快 xff0c 但是下载速度较慢 xff0c 不开通会
  • 使用腾讯云轻量应用服务器搭建一个简洁漂亮的目录

    前言 作为一个摄影爱好者 xff0c 会经常做一些图片的分享 xff0c 前端时间在网上看到了一个非常好看的目录 xff0c 这里给大家分享一下怎么样通过腾讯轻量应用服务器来搭建 官方介绍 files photo gallery是一款简洁漂
  • 玩转服务器-博客两件套之绝佳的Markdown写作平台CodiMD

    前言 大家都很羡慕博主的高产 xff0c 纷纷问我有什么技巧 我的回复是手熟 xff0c 多写 xff0c 那么多写就需要一个比较好的工具 xff0c 所以我这里给大家介绍一个在线markdown文档平台 xff0c 让大家可以随时书写文档
  • 玩转服务器-博客两件套之开源的一文多发平台ArtiPub

    玩转服务器 博客两件套之开源的一文多发平台ArtiPub 前言 上次给大家介绍了 xff0c 博主在线的markdown文档平台 xff0c 让大家可以随时书写文档和博客 xff0c 那么很多朋友在很多平台都看到了我的文章 xff0c 我是
  • 使用acme.sh申请Let‘s Encrypt免费的SSL证书

    使用acme sh申请Let s Encrypt免费的SSL证书 说明 xff1a Let s Encrypt 是一个由非营利性组织 互联网安全研究小组 xff08 ISRG xff09 提供的免费 自动化和开放的证书颁发机构 xff08
  • win7操作系统下laravel/homestead在SSH auth method: private key卡住提示Warning: Connection reset. Retrying的解决方案

    将VirtualBox兼容模式改为win7 勾选以管理员身份运行 安全里面各组个用户全部编辑好权限并勾选 电脑开机后优先双击VirtualBox启动后在执行git命令行进行启动
  • 为什么用了索引,SQL查询还是慢?

    原文链接cnblogs com jackyfei p 12122767 html 经常有同学疑问 xff0c 为什么有时候一个SQL语句使用了索引 xff0c 为什么还是会进入到慢查询之中呢 xff1f 今天我们就从这个问题开始来聊一聊索引
  • 腾讯云轻量应用服务器器使用技巧-腾讯云OrcaTerm的上传下载

    前言 xff1a 上传下载是WebShell中不可或缺的功能之一 xff0c 也是我在日常管理过程中经常使用操作 这里就跟着博主的视角来揭秘 xff0c 腾讯云OrcaTerm的上传与下载 对比 博主对比了一些shell的应用 xff0c
  • C语言strtok函数

    strtok是C语言用于分割字符串的函数 xff0c 需要include lt string h gt 第一次使用时第一个参数传入待分割的字符串 xff0c 第二个参数传入分割符号 第二次使用时第一个函数传入NULL 第二个参数传入分割符号
  • CSS | 置换元素(可替换元素)

    文章目录 置换元素 定义 常见置换元素 固有尺寸 非置换元素 注意 若文章有任何纰漏或未涉及你想了解的内容 欢迎在评论提出 我会尽最快速度回复 置换元素 定义 置换元素是具有固有尺寸 intrinsic dimensions 浏览器根据其标
  • 人体姿态估计综述(Human Pose Estimation Overview)

    主流数据集整理 xff1a http blog csdn net qq 36165459 article details 78332172 Part1 xff1a Single Person Pose Estimation 2015 年之前
  • 1到100的二进制表示

    1 61 1 2 61 10 3 61 11 4 61 100 5 61 101 6 61 110 7 61 111 8 61 1000 9 61 1001 10 61 1010 11 61 1011 12 61 1100 13 61 11
  • 画格子

    题目描述 画一些小格子 xff0c 如下所示 xff1a MAKEAMERICA AKEAMERICAG KEAMERICAGR EAMERICAGRE AMERICAGREA MERICAGREAT ERICAGREATA RICAGRE
  • golang -----------字符串(rune,string,type)

    一 内存布局 字符串在Go语言内存模型中用一个2字长的数据结构表示 它包含一个指向字符串存储数据的指针和一个长度数据 因为string类型是不可变的 xff0c 对于多字符串共享同一个存储数据是安全的 切分操作str i j 会得到一个新的