前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go语言字符串类型储存解析

go语言字符串类型储存解析

原创
作者头像
暮雨
修改2019-08-19 17:30:30
8970
修改2019-08-19 17:30:30
举报
文章被收录于专栏:云端漫步云端漫步

在这篇文章中,将对字符串进行展开。字符串是一串固定长度的字符连接起来的字符集合。go语言中的字符串使用utf-8编码。

字符串的存储结构

使用unsafe.Sizeof()打印字符串,可以发现它的长度是一个定值16,通过查看源码,我们知道string的结构如下:

代码语言:txt
复制
type stringStruct struct {
	str unsafe.Pointer
	len int
}

字符串的实际存储是一个byte数组,length长度就是字符数组的长度。这里的byte数组存储的是字符串的utf-8的编码

字符串的遍历

  1. 通过for以字节码的方式遍历
代码语言:txt
复制
package main

import (
	"fmt"
)

func main() {
	var aa = "你好"
	for i := 0; i < len(aa); i++ {
		fmt.Printf("%d ", aa[i])
	}
	fmt.Println()
}

// 运行结果
228 189 160 229 165 189

此处打印的结果为中文字符串在计算机内存中存储实际存储的值,数据类型为byte

  1. for range以rune的方式遍历
代码语言:txt
复制
package main

import (
	"fmt"
)

func main() {
	var aa = "你好"
	for idx, val := range aa {
		fmt.Printf("%d, %d \n", idx, val)
	}
}
// 运行结果
0, 20320
3, 22909

这里的打印的值为中文字符串对用的unicode码值,数据类型为rune,for range内部封装了utf-8转unicode的逆运算。

查看字符串的内存存储

使用GDB工具对以下代码进行debug,查看内存中的数据,设定实现以下三个目标

  1. 查看字符串数据结构
  2. 查看字符串的长度
  3. 查看字符串内存中的存储的值
代码语言:txt
复制
package main

import "fmt"

var ss string

func main() {
	ss = "hello"
	fmt.Println(ss)
}
如下图

字符串访问

代码语言:txt
复制
package main

import "fmt"

func main() {
	var ch = "hello"

	val := ch[0]
	fmt.Printf("val的类型:%T \nval的值:%d\n", val, val)
}
// 运行结果
val的类型:uint8
val的值:104

因为字符串是只读的,不能通过下标修改其值

字符串和字节切片的相互转化

go内置了string转byte切片互转的函数

代码语言:txt
复制
package main

import "fmt"

func main() {
	var ch = "hello world!"
	var val = []byte(ch)

	fmt.Println(val)

	var str = string(val)
	fmt.Println(str)
}
// 运行结果
[104 101 108 108 111 32 119 111 114 108 100 33]
hello world!

这里的转化不是将string结构体中指向的byte切片直接做赋值操作,而是通过copy实现的,在数据量比较大时,这里的转化会比较耗费内存空间。

喜欢请关注微信公众号“云端漫记", 持续为你更新

qrcode_for_gh_c30f7a9a484e_430.jpg
qrcode_for_gh_c30f7a9a484e_430.jpg

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 字符串的存储结构
  • 字符串的遍历
  • 查看字符串的内存存储
  • 字符串访问
  • 字符串和字节切片的相互转化
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档