Golang学习——string和slice切片

这篇具有很好参考价值的文章主要介绍了Golang学习——string和slice切片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

string

整数存储

Golang学习——string和slice切片,Golang学习,golang,学习,开发语言

  • 1个字节可以表示256个数字,2个字节可以表示65536个数字

字符存储

  • 字符集:字符编号对照表。收录很多数字,给它们一一编号。
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 字符集的更迭
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 全球化统一标准——通用字符集

Unicode

  • 于1990年开始研发并于1994年正式公布,实现了跨语言跨平台的文本转换与处理。
  • 字符集促成了字符与二进制的合作。但不是万事大吉:如何存储?

存储

  • 存储的歧义
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 字符边界解决:定长编码,位数不够高位补零。
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 缺点:浪费内存。

变长编码规则

  • Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 解码的过程
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 编码的过程
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • UTF-8是GO语言默认的编码方式:字符集配合编码

字符串类型变量的结构

  • 变量:起始地址。在内容结尾处放特定标识符。
  • c语言使用字符编号为0的字符。(字符串内容不能出现这个标识符)
  • GO语言并没有采取相同方式,而是在起始地址后面多存一个长度,长度为字节个数。
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 可读取不能修改
  • 原因:Go语言认为字符串内容是不会被修改的。会将定义的字符串内容分配到只读内存段。内存中的读、写、执行权限是为了保护程序正常运行。
  • 字符串变量是可以共用底层字符串内容的。

字符串变量的修改方式

  • 1.可以直接给变量整体赋新值,它存储的地址就会指向新的内容,并没有去“修改”原来的内存。
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 2.也可以把变量强制类型转换成字节slice,
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 这样会为slice变量重新分配一段内存,并且会拷贝原来字符串的内容,同样可以脱离只读内存的限制。

slice

  • 元素存哪里,存了多少个元素,可以存多少个元素。
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 声明一个整型slice,变量ints由这样三个部分组成。
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • slice的元素要存在一段连续的内存中
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • data就是这个底层数组的起始地址,但因只分配了切片结构,所以为nil。
  • 存储元素个数为0,容量也为0。

通过make的方式定义变量

  • 不仅会分配这三部分结构,还会开辟一段内存作为它的底层数组。
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • make会为ints开辟一端容纳5个整型元素的内存,还会把它们初始化为整型的默认值0,但是目前这个slice只存储了两个元素。
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言

new

  • new一个slice变量,同样会分配三部分结构,但它不负责底层数组的分配。data=nil。
  • new的返回值就是slice结构的起始地址。
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 此时,这样的slice变量还没有底层数组。
  • append用来分配底层数组。
  • 通过append的方式添加元素,它就会给slice开辟底层数组。
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言

底层数组

  • 数组:同种类型的元素一个挨一个的存储。
  • int型slice
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • string型slice
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 是什么,底层就是什么数组。
  • 不一定指向数组开头。
  • 数组容量声明了就不能改变Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • s1:1,2,3,左闭右开,从1开始,容量为9;
  • s2:7,8,9,容量也为3;
  • 索引左边决定容量,右边决定长度。
  • 给s1扩大访问元素
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 给s2添加元素(copy,注意容量到2倍)Golang学习——string和slice切片,Golang学习,golang,学习,开发语言

slice扩容规则

1.预估扩容后的容量newCap

Golang学习——string和slice切片,Golang学习,golang,学习,开发语言文章来源地址https://www.toymoban.com/news/detail-554655.html

  • 非固定1.25

2.newCap个元素需多大内存

  • NOGolang学习——string和slice切片,Golang学习,golang,学习,开发语言
  • 在许多编程语言中,申请分配内存,并不是直接与操作系统交涉,而是和语言自身实现的内存管理模块,它会提前向操作系统申请一批内存,分成常用的规格管理起来。待申请内存时,会帮助我们匹配到足够大且最接近的规格。

3.匹配到合适的内存规格

  • 5*8=40,实际:匹配到48字节。
  • 48/8=6个

练习

  • 16 bytes=8 bytes(指针8个字节)+8 bytes(len,Go中64位机器下Int占8个字节)
  • 多出来的是字节长度占的内存
    Golang学习——string和slice切片,Golang学习,golang,学习,开发语言

到了这里,关于Golang学习——string和slice切片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Golang 中的数组Array以及Slice底层实现

    Golang 中的数组Array以及Slice底层实现

    数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素 (element),这种类型可以是任意的原始类型,比如 int 、 string 等,也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。 在 Golang 中数组是一个长度固定的数据类型, 数组的长度

    2024年02月16日
    浏览(13)
  • Golang 中的 slice 为什么是并发不安全的?

    Golang 中的 slice 为什么是并发不安全的?

      在Go语言中,slice是并发不安全的,主要有以下两个原因:数据竞争、内存重分配。   数据竞争:slice底层的结构体包含一个指向底层数组的指针和该数组的长度,当多个协程并发访问同一个slice时,有可能会出现数据竞争的问题。例如,一个协程在修改slice的长度,而

    2024年02月05日
    浏览(17)
  • golang无需创建新切片

    在 Go 语言中,`append(b, 0)[:len(b)]` 是一种常见的用法,用于在切片 `b` 后追加一个元素,并返回旧切片的前 `len(b)` 个元素。 这种用法的目的是将一个新元素追加到切片中,并确保切片的长度保持不变。具体步骤如下: 1. `append(b, 0)`:通过 `append` 函数将元素 `0` 追加到切片 `b`

    2024年02月11日
    浏览(10)
  • 【Go】Go 语言教程--GO语言切片(Slice)(十四)

    往期回顾: Go 语言教程–介绍(一) Go 语言教程–语言结构(二) Go 语言教程–语言结构(三) Go 语言教程–数据类型(四) Go 语言教程–语言变量(五) Go 语言教程–GO语言常量(六) Go 语言教程–GO语言运算符(七) Go 语言教程–GO条件和循环语句(八) Go 语言教程

    2024年02月16日
    浏览(9)
  • golang字符串切片去重

    函数的功能是从输入的字符串切片中去除重复的元素,并返回去重后的结果。具体的实现逻辑如下: 创建一个空的结果切片 result ,用于存储去重后的字符串。 创建一个临时的map tempMap ,用于存放不重复的字符串。map的键是字符串,值是字节类型。 遍历输入的字符串切片

    2024年02月12日
    浏览(8)
  • golang 基于数组、切片、链表实现队列

    数组 切片 链表 链表加锁实现线程安全 cas 实现 无锁队列

    2024年02月04日
    浏览(12)
  • 【GoLang】【工具分享】1、根据 JsonTag 对 slice 进行稳定排序(不支持嵌套)

    后端返回 List 列表中的 Json 序列化结构到前端,其中包含许多字段,业务需求可以按照某个字段对列表数据做 升/降序排序。 前端将后端返回的 Json 及排序方向作为参数传递至后端即可,后端根据 Json 排序找到对应的 JsonTag 后,采用反射找到字段,再写自定义排

    2024年02月12日
    浏览(9)
  • 为什么 Golang Fasthttp 选择使用 slice 而非 map 存储请求数据

    为什么 Golang Fasthttp 选择使用 slice 而非 map 存储请求数据

    Fasthttp 是一个高性能的 Golang HTTP 框架,它在设计上做了许多优化以提高性能。其中一个显著的设计选择是使用 slice 而非 map 来存储数据,尤其是在处理 HTTP headers 时。 为什么呢? 本文将从简单到复杂,逐步剖析为什么 Fasthttp 选择使用 slice 而非 map,并通过代码示例解释这一

    2024年01月22日
    浏览(12)
  • Golang教程一(环境搭建,变量,数据类型,数组切片map)

    Golang教程一(环境搭建,变量,数据类型,数组切片map)

    目录 一、环境搭建 1.windows安装 2.linux安装  3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 格式化输出 7.输入  三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字符 多行字符串 5.布尔类型

    2024年04月16日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包