《快学 Go 语言》第 7 课 —— 冰糖葫芦串

STM32+MPU6050互补滤波姿态解算:原理、代码与调参实战 姿态解算是飞控系统的基础,而互补滤波则是其中性价比最高的经典算法。在无人机、平衡车等嵌入式项目中,通过加速度计与陀螺仪的频域互补,可以在STM32这类低算力单片机上实时估计四元数姿态。互补滤波原理简单、运算量小,却能在动态场景下提供稳定的姿态输出,兼顾静态精度与动态响应。基于MPU6050六轴传感器,搭配Mahony互补滤波实现,可得到无漂移的欧拉角,并解决传统一阶滤波中固定权重无法自适应的问题。本文从传感器特性入手,逐步拆解算法推导、代码实现和调参细节,帮助硬件开发者快速搭建可靠的姿态解算模块,为后续PI 阅读详情

字符串通常有两种设计,一种是「字符」串,一种是「字节」串。「字符」串中的每个字都是定长的,而「字节」串中每个字是不定长的。Go 语言里的字符串是「字节」串,英文字符占用 1 个字节,非英文字符占多个字节。这意味着无法通过位置来快速定位出一个完整的字符来,而必须通过遍历的方式来逐个获取单个字符。

图片

我们所说的字符通常是指 unicode 字符,你可以认为所有的英文和汉字在 unicode 字符集中都有一个唯一的整数编号,一个 unicode 通常用 4 个字节来表示,对应的 Go 语言中的字符 rune 占 4 个字节。在 Go 语言的源码中可以找到下面这行代码,rune 类型是一个衍生类型,它在内存里面使用 int32 类型的 4 个字节存储。

type rune int32

为了进一步方便读者理解字节 byte 和 字符 rune 的关系,我花了下面这张图

图片

其中 codepoint 是每个「字」的其实偏移量。Go 语言的字符串采用 utf8 编码,中文汉字通常需要占用 3 个字节,英文只需要 1 个字节。len() 函数得到的是字节的数量,通过下标来访问字符串得到的是「字节」。

按字节遍历

字符串可以通过下标来访问内部字节数组具体位置上的字节,字节是 byte 类型

package main

import "fmt"

func main() {
    var s = "嘻哈china"
    for i:=0;i<len(s);i++ {
        fmt.Printf("%x ", s[i])
    }

}

-----------
e5 98 bb e5 93 88 63 68 69 6e 61

按字符 rune 遍历

package main

import "fmt"

func main() {
    var s = "嘻哈china"
    for codepoint, runeValue := range s {
        fmt.Printf("%d %d ", codepoint, int32(runeValue))
    }
}

-----------
0 22075 3 21704 6 99 7 104 8 105 9 110 10 97

字节串的内存表示

如果字符串仅仅是字节数组,那字符串的长度信息是怎么得到呢?要是字符串都是字面量的话,长度尚可以在编译期计算出来,但是如果字符串是运行时构造的,那长度又是如何得到的呢?

var s1 = "hello" // 静态字面量
var s2 = ""
for i:=0;i<10;i++ {
  s2 += s1 // 动态构造
}
fmt.Println(len(s1))
fmt.Println(len(s2))

图片

当我们将一个字符串变量赋值给另一个字符串变量时,底层的字节数组是共享的,它只是浅拷贝了头部字段。

字符串是只读的

你可以使用下标来读取字符串指定位置的字节,但是你无法修改这个位置上的字节内容。如果你尝试使用下标赋值,编译器在语法上直接拒绝你。

package main

func main() {
    var s = "hello"
    s[0] = 'H'
}
--------
./main.go:5:7: cannot assign to s[0]

切割切割

字符串在内存形式上比较接近于切片,它也可以像切片一样进行切割来获取子串。子串和母串共享底层字节数组。

package main

import "fmt"

func main() {
    var s1 = "hello world"
    var s2 = s1[3:8]
    fmt.Println(s2)
}

-------
lo wo

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

在使用 Go 语言进行网络编程时,经常需要将来自网络的字节流转换成内存字符串,同时也需要将内存字符串转换成网络字节流。Go 语言直接内置了字节切片和字符串的相互转换语法。

package main

import "fmt"

func main() {
    var s1 = "hello world"
    var b = []byte(s1)  // 字符串转字节切片
    var s2 = string(b)  // 字节切片转字符串
    fmt.Println(b)
    fmt.Println(s2)
}

--------
[104 101 108 108 111 32 119 111 114 108 100]
hello world

从节省内存的角度出发,你可能会认为字节切片和字符串的底层字节数组是共享的。但是事实不是这样的,底层字节数组会被拷贝。如果内容很大,那么转换操作是需要一定成本的。

那为什么需要拷贝呢?因为字节切片的底层数组内容是可以修改的,而字符串的底层字节数组是只读的,如果共享了,就会导致字符串的只读属性不再成立。

640?wx_fmt=jpeg

扫一扫二维码,阅读《快学 Go 语言》更多章节

简单海龟做图游戏 简单的实现海龟作图游戏,C++课程作业,笔尖朝上朝下问题哟 立即下载

相关推荐

cadence allegro 17.x 降版本到16.6的转换工具

Cadence17.x版本降低到16.6版本转换工具 下载链接:Cadence17.x版本降低到16.6版本转换工具   使用方法: 软件使用比较简单,在「第一个路径输入栏」浏览指向17.x的设计文件,也就是需要降版本的17.4或者17.2的文件,然后在「第二个路径输入栏」里浏览指向转换后的文件保存路径,然后点击「转换」按钮即可。 ...

ltqdxl的博客 1万+

[Matlab]糖葫芦代码实现

clc;clear; figure(1); [x y z]=sphere(50); %球由50*50的球面组成 surf(2*x,2*y,2*z,'FaceColor',[1,0,0]); %%画一个圆心在(0,0,0),半径为2的球,并设置其颜色为红色 hold on %保持该图形的位置 [x y z]=sphere(50); surf(2*x,2*y,2*(z-2),'FaceColor',[1,0,0]); hold on [x y z]=sphere(50); surf(2*x..

m0_59259485的博客 896

QSPI Flash的原理与QSPI时序的Verilog实现

本节主要是讨论QSPI(Quad SPI,四线SPI总线)的相关内容。我的开发板上有一片型号是W25Q128BV的Quad SPI Flash存储器,本文将以它为例子来说明QSPI操作的一些内容。

Go Forward Forever! 4167

python用小海龟画糖葫芦

python小海龟画糖葫芦 import turtle #导入小海龟模块 t=turtle.Pen() #创建画笔 t.penup() #提起画笔 t.goto(20, 0) #起始坐标 t.pendown() #下笔 t.begin_fill() #填充颜色 t.fillcolor(“red”)#填充红色 t.circle(40) #画圆半径:40 t.end_fill() #结束填充 t.penup() t.goto(60,40) t.pendown()

qq_45938341的博客 4118

超越PSPNet:PPM模块在医疗影像分割中的创新应用实验

本文探讨了PPM模块在医疗影像分割中的创新应用,通过定制化调整和优化策略显著提升分割精度。针对医疗影像的多尺度病灶特点,提出了动态尺度选择和交叉尺度融合模块(CSFM),结合PyTorch实现细节,使小病灶检测召回率提升11.3%。实验显示优化后的模型mIoU达到78.6%,较基线提升9.2个百分点,同时满足实时处理需求。

u9v0w的博客 220

深入了解 Google Gemini:主要功能是什么以及我们为什么要使用它?

Google Gemini开启AI新纪元,以其独特的多模式功能重塑技术未来。

KompasAI的博客 4070

python绘制糖葫芦_python用小海龟画糖葫芦

python小海龟画糖葫芦import turtle #导入小海龟模块t=turtle.Pen() #创建画笔t.penup() #提起画笔t.goto(20, 0) #起始坐标t.pendown() #下笔t.begin_fill() #填充颜色t.fillcolor(“red”)#填充红色t.circle(40) #画圆半径:40t.end_fill...

weixin_39758494的博客 2831

ESP32实战指南:SPI驱动ADXL345三轴加速度传感器的精准数据采集与姿态解算

本文详细介绍了如何使用ESP32通过SPI接口驱动ADXL345三轴加速度传感器,实现精准数据采集与姿态解算。从硬件连接到SPI通信优化,再到数据处理和低功耗策略,提供了全面的实战指南。特别适合物联网开发者和硬件工程师参考,帮助快速掌握传感器数据采集技术。

vim8coder的博客 1042

快速学习Go语言

if语句if语句用于判断某个条件是否成立,如果条件成立则执行if语句块内的代码,否则不执行。语法结构如下:// if 语句块 } else if condition2 {// else if 语句块 } else {// else 语句块 }switch语句switch语句用于根据不同的条件执行不同的代码块。语法结构如下:case value1 : // case1 语句块 case value2 : // case2 语句块 ... default : // default 语句块 }

qq_30245525的博客 2335

YOLOv10改进策略【模型轻量化】| 替换骨干网络为MoblieNetV2,含模型详解和完整配置步骤

本文记录的是。采用深度可分离卷积将标准卷积分解为深度卷积和1×1卷积。同时,引入来,避免非线性层导致的性能下降问题。本文将应用到YOLOv10中,借助其高效的结构和特性,在保持一定精度的前提下,显著降低YOLOv10的计算复杂度和内存占用。

Limiiiing的博客 533

C#中通过Mapster实现轻量级高效对象映射器:从零到精通

本文介绍了.NET生态中高性能对象映射库Mapster的完整使用指南。从基础安装(通过NuGet包)到快速入门示例,展示了如何实现简单对象映射。进一步讲解了自定义映射规则、命名不一致属性的处理方式,以及如何在ASP.NET Core中集成Mapster服务。针对复杂场景,详细解析了嵌套对象映射的配置技巧,并提供了性能优化方案(如预编译映射器)和调试技巧(启用调试模式、捕获映射异常)。通过完整的代码实践,帮助开发者高效解决从基础到高级的对象映射需求。

墨夶的博客 742

用Python的turtle库写一串糖葫芦!

最近看turtle库挺好玩,就自学了一下,若有什么错误请各路大神指教,弟弟要串糖葫芦,就给他一串! 效果如下: 如果觉得还可以,就往下看代码吧 若中间有什么问题可以随时问我,欢迎留言,让我们一起学,一起进步 ...

巴胡子 6913

使用Navicat连接Oracle数据库及ORA-12541: TNS: 无监听程序、ORA-28547:connection to server failed、ORA-12514:TNS报错解决方案

使用Navicat连接Oracle数据库及ORA-12541: TNS: 无监听程序、ORA-28547:connection to server failed、ORA-12514:TNS报错解决方案。

蓝多多的小仓库 5219

11月20日云栖精选夜读 | 深度解读阿里巴巴云原生镜像分发系统 Dragonfly

Dragonfly 是一个由阿里巴巴开源的云原生镜像分发系统,主要解决以 Kubernetes 为核心的分布式应用编排系统的镜像分发难题。随着企业数字化大潮的席卷,行业应用纷纷朝微服务架构演进,并通过云化平台优化业务管理。 热点热议 深度解读阿里巴巴云原生镜像分发系统 Dragonfly 作者:技术小能手发表在:阿里系统软件技术 全球首家!阿里云获GN...

weixin_33670713的博客 201

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

特色英文短语[转帖] 

中国特色词汇  中华民族的喜庆节日( Chinese Festivial ) 国庆节 National Day中秋节 Mia-Autumn Festival春节 Spring Festival 元宵节 Lantern Festival儿童节 Childrens Day端午节 Dragon Boat Festival 妇女节 Women s Day

上海夜未眠 1951

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【愚公系列】《剪映+DeepSeek+即梦:短视频制作》050-转场:短视频一气呵成的秘密(用DeepSeek生成创意文本)

DeepSeek 是一款人工智能辅助工具,专注于文本生成与创意支持,如图11-1所示。它基于大数据分析与自然语言处理技术,能够为创作者提供选题策划、文案撰写、脚本生成等文字创作支持,我们只需要在AI生成的内容上做优化调整,就能高效产出优质视频。

愚公智库 3万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

中国独特词英文表达

1、中国意念词(Chinesenesses)八卦trigram阴、阳yin,yang道Dao(cf.logo)江湖(世界)thejianghuWorld(thetraits'world)e.g.Youcan'tcontroleverythinginatraits'world.(人在江湖,身不由己)道Daoism(Taoism)上火excessiveinternalheat儒学Confucianis...

happmaoo的专栏 281

特色英文短语

中国特色词汇 中华民族的喜庆节日( Chinese Festivial ) 国庆节 National Day 中秋节 Mia-Autumn Festival 春节 Spring Festival 元宵节 Lantern Festival 儿童节 Children's Day 端午节 Dragon Boat Festival 妇女节 Women ' s Day 泼水节 Wa...

46

Python画糖葫芦和奥运五环

糖葫芦 import turtle #调用画笔 t=turtle.Pen() #画笔速度 turtle.speed(2) #画线颜色 turtle.pencolor('blue') #线的宽度 turtle.pensize(5) #圆半径的长度 turtle.circle(70) #第二个圆 #抬起画笔 turtle.penup() #位移的坐标 turtle.goto(110,0) #落下画笔开始画图 turtle.pendown() turtle.color('black') turtle.circl.

weixin_50108821的博客 1312

用python画一个糖葫芦

用到了自己建立函数,传参,turtle库 import turtle def drawCircle(radius,angle,n=1,color="red"): turtle.seth(angle) for i in range(n): turtle.fillcolor(color) turtle.begin_fill() turtle.circle(radius,360) turtle.end_fill() t

qq_51666744的博客 5315

冰糖葫芦的php代码,食物语冰糖葫芦技能一览

冰糖葫芦是中国传统小吃,一般用山楂串成,糖稀冻硬,吃起来又酸又甜,还很冰。在食物语中他晶莹剔透,天真烂漫是小朋友的最爱,今天小编就带来分享的食物语冰糖葫芦技能一览,一起来看看吧。希望对大家有帮助哟!食物语冰糖葫芦技能一览食物语冰糖葫芦介绍冰糖葫芦源自于江湖郎中献给宋光宗宠妃的奇药。化灵于南宋的冰糖葫芦,与生俱来-股自信劲儿,或许是因创制者勇揭皇榜的勇气,他成为了一一个想到什么就会立刻去做的行动派。...

weixin_32644565的博客 604

python绘制糖葫芦_冰糖葫芦怎么画

冰糖葫芦是一种十分传统的小吃,一说到它,就会勾起无数人甜蜜的童年回忆,那甜甜的糖稀,裹着酸甜的山楂,咬上一口,别提有多好吃了,接下来,小编就来教大家冰糖葫芦怎么画吧。冰糖葫芦的历史可谓源远流长,相传大约起源于南宋绍熙年间。即便到现在,也仍然深受无数人的喜爱。冰糖葫芦简直就是我们幸福的童年。那一个个冰糖葫芦,红红的、圆圆的,不就像我们童年时那红扑扑的圆脸蛋吗?所有的女孩子都喜欢吃冰糖葫芦,都喜欢在一...

weixin_36467693的博客 2675
上一篇: Go 语言技术大佬们在 Twitter 上打起了口水战
下一篇: 《快学 Go 语言》第 7 课 —— 诱人的烤串
codehole_
博客等级 码龄7年 34粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值