Golang学习——string和slice切片

news2024/11/23 15:53:24

Golang学习——string和slice切片

  • string
    • 整数存储
    • 字符存储
    • Unicode
      • 存储
      • 变长编码规则
      • 字符串类型变量的结构
      • 字符串变量的修改方式
  • slice
    • 通过make的方式定义变量
    • new
    • 底层数组
    • slice扩容规则
      • 1.预估扩容后的容量newCap
      • 2.newCap个元素需多大内存
      • 3.匹配到合适的内存规格
      • 练习

string

整数存储

在这里插入图片描述

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

字符存储

  • 字符集:字符编号对照表。收录很多数字,给它们一一编号。
    在这里插入图片描述
  • 字符集的更迭
    在这里插入图片描述
  • 全球化统一标准——通用字符集

Unicode

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

存储

  • 存储的歧义
    在这里插入图片描述
  • 字符边界解决:定长编码,位数不够高位补零。
    在这里插入图片描述
  • 缺点:浪费内存。

变长编码规则

  • 在这里插入图片描述
  • 解码的过程
    在这里插入图片描述
  • 编码的过程
    在这里插入图片描述
  • UTF-8是GO语言默认的编码方式:字符集配合编码

字符串类型变量的结构

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

字符串变量的修改方式

  • 1.可以直接给变量整体赋新值,它存储的地址就会指向新的内容,并没有去“修改”原来的内存。
    在这里插入图片描述
  • 2.也可以把变量强制类型转换成字节slice,
    在这里插入图片描述
  • 这样会为slice变量重新分配一段内存,并且会拷贝原来字符串的内容,同样可以脱离只读内存的限制。

slice

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

通过make的方式定义变量

  • 不仅会分配这三部分结构,还会开辟一段内存作为它的底层数组。
    在这里插入图片描述
  • make会为ints开辟一端容纳5个整型元素的内存,还会把它们初始化为整型的默认值0,但是目前这个slice只存储了两个元素。
    在这里插入图片描述

new

  • new一个slice变量,同样会分配三部分结构,但它不负责底层数组的分配。data=nil。
  • new的返回值就是slice结构的起始地址。
    在这里插入图片描述
  • 此时,这样的slice变量还没有底层数组。
  • append用来分配底层数组。
  • 通过append的方式添加元素,它就会给slice开辟底层数组。
    在这里插入图片描述

底层数组

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

slice扩容规则

1.预估扩容后的容量newCap

在这里插入图片描述

  • 非固定1.25

2.newCap个元素需多大内存

  • NO在这里插入图片描述
  • 在许多编程语言中,申请分配内存,并不是直接与操作系统交涉,而是和语言自身实现的内存管理模块,它会提前向操作系统申请一批内存,分成常用的规格管理起来。待申请内存时,会帮助我们匹配到足够大且最接近的规格。

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

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

练习

  • 16 bytes=8 bytes(指针8个字节)+8 bytes(len,Go中64位机器下Int占8个字节)
  • 多出来的是字节长度占的内存
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何进行高效的日程管理?

在日程安排逐渐增多的现代职场中,如果想要高效完成工作事项,就必须做好每天的日常管理。但是有不少上班族表示自己在做日程管理时往往感到力不从心,很难做到真正有效的管理自己的日程安排,那么问如何进行高效的日程管理呢&#xf…

利用Python数据挖掘技术深入理解股票回撤的本质

股票回撤是投资者关注的一个重要指标,也是进行风险评估和投资决策的必要依据。通过利用Python数据挖掘技术深入理解股票回撤的本质,可以更加准确地评估风险和制定投资策略。 一、什么是股票回撤 股票回撤是指股票价格在上涨过程中出现暂时的下跌&#…

2023开放式蓝牙耳机推荐,开放式耳机如何选购?十五款开放式耳机一文看到底!

最近发现网上很多小伙伴在挑选开放式蓝牙耳机,也看到很多开放式耳机的评测文章,五花八门,各式各样,导致很多小伙伴想挑选一款好用的开放式耳机,却又怕踩雷! 那么问题来了!怎样选择一款合适的开…

代码随想录二刷 day48 |动态规划之 198打家劫舍 213打家劫舍II 337打家劫舍III

day48 198.打家劫舍1.确定dp数组(dp table)以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 213.打家劫舍II情况一:考虑不包含首尾元素情况二:考虑包含首元素,不包含尾元素情况三&…

在培训班里学技术,真的有用吗?

在培训班里学技术,真的有用吗? 😇博主简介:我是一名正在攻读研究生学位的人工智能专业学生,我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑,欢迎随时来交流哦&…

打印机从0到入门

一.连接 1.USB连接方式 2.网络打印服务器连接方式 使用打印服务器可以将不能联网的打印机设置为同一网段下的主机均可使用,有的打印服务器也可跨网段连接。 二.共享 不同终端处于同个网络下,主机网络通信通过WIFI连接(打印机连接的主机通…

2023最新 Navicat 16.2.3 安装和试用教程详解

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

四个按键控制led的四种变化(按键控制led)(附源码)

文章目录 一、实验任务二、系统框图三、代码实现四、引脚分配五、总结 一、实验任务 使用开发板上的四个按键控制四个LED灯。按下不同的按键时,四个LED灯显示不同效果。本实验是在EP4CE6F17C8开发板上实现,仿真请用modelsim Altera 二、系统框图 三、代…

23 分页控件

文章目录 界面设置初始化主对话框子页面初始化 页面1枚举窗口页面2枚举进程全部代码 界面设置 ui 设置 >创建CTablCtrl > 创建页控件(子窗口),style设置成为chlid 添加类 页面中加入listCtrl 控件 添加变量 分别添加初始化函数 初始化…

3ds Max 建模基础教程:创建棕榈植物

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 嘿伙计们,在本教程中,我们将学习如何使用其花盆创建棕榈植物,首先我们将对花盆进行建模,然后设置叶子和纹理,我从谷歌搜索中找到了纹理&#xff0…

常用的k8s管理命令

Kubernetes 是一个由主节点和工作节点组成的容器编排工具。它只允许通过作为控制平面核心组件的 API 服务器进行通信。API 服务器公开了一个 HTTP REST API,允许内部组件(如用户和集群)和外部组件之间的通信。 你可以将 API 服务器视为 Kuber…

RestClient操作索引库

一、初始化RestClient 分为三步&#xff1a; 1&#xff09;引入es的RestHighLevelClient依赖&#xff1a; <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dep…

字节面试:连接一个不存在的 IP 地址,会发生什么?

分享两个字节面试题&#xff0c;都是基于场景问的网络问题。 Q1&#xff1a;客户端连接一个不存在的 IP 地址&#xff0c;会发生什么&#xff1f; Q2&#xff1a;客户端连接一个存在的 IP 地址但是端口不存在&#xff0c;会发生什么&#xff1f; PS&#xff1a;这里的「连接…

leetcode:2395. 和相等的子数组(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的整数数组 nums &#xff0c;判断是否存在 两个 长度为 2 的子数组且它们的 和 相等。注意&#xff0c;这两个子数组起始位置的下标必须 不相同 。 如果这样的子数组存在&#xff0c;请返回 true&#xff0c;否则返回 false 。 子数…

快消品行业企业如何选择适合自己的订单管理系统源码

快消品行业企业在选择适合自己的订单管理系统源码时&#xff0c;需要考虑以下五个方面&#xff1a; 首先&#xff0c;企业需要考虑订单管理系统的功能是否能够满足自身的需求。订单管理系统应该具备订单录入、订单查询、订单处理、订单跟踪、进销存管理、临期提醒等基本功能&am…

创业大赛,助力AI创业团队加速发展

AI产业投资人认为&#xff0c;参加AI大模型大赛的企业&#xff0c;无论是大厂还是创业团队&#xff0c;在技术、资本和产品等方面都面临全方位的竞争。特别对于创业团队而言&#xff0c;早期的问题是缺乏资金和技术支持&#xff0c;这让很多创业团队犹豫不决。 大型模型的研发…

2.MySQL- Linux 常见指令

目录 回顾&#xff1a;Linux 常见命令 一、创建目录 make directory (mkdir) 二、创建一个空白的文本文件 (touch) 练习 三、查看文本文件内容相关的指令&#xff08;cat head tile...&#xff09; 3.1 cat 3.2 head & tail 3.3 wc -l 3.4 grep 3.5 less & …

电脑城要倒闭?“泰酷辣”

电脑城要倒闭&#xff1f;“泰酷辣” &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&#xff01;&#x1…

走进Linux世界【一、Linux概述】

第一章 Linux概述 1、操作系统 ​ 定义&#xff1a;操作系统(Operating System&#xff0c;简称OS)是管理计算机硬件与软件资源的计算机程序 ​ 作用&#xff1a;是把计算机系统中对硬件设备的操作封装起来&#xff0c;供应用软件调用&#xff0c;也是提供一个让用户与系统交…

I2C(IIC)总线 物理层

2C 通信设备常用的连接方式如下图&#xff1a; ①它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C 通讯总线中&#xff0c;可连接多个I2C 通讯设备&#xff0c;支持多个通讯主机及多个通讯从机。 ②一个I2C 总线只使用两条总线线路&#xff0c;一条双向串…