《快学 Go 语言》第 7 课 —— 诱人的烤串

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

640?wx_fmt=jpeg

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

640?wx_fmt=other

图片

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

type rune int32

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

640?wx_fmt=other

图片

其中 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))

640?wx_fmt=other

图片

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

字符串是只读的

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

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++课程作业,笔尖朝上朝下问题哟 立即下载

相关推荐

MONAI教程<1>-安装

MONAI的安装非常简单,常用的有两种方法: 直接 pip install monai 从GitHub 上安装 monai是通常配合其他库一起使用的,比如pytorch, nibabel, skimage, pillow等等。缺什么直接pip install 就行

Tina姐的博客 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

400G光模块测试全攻略:从PCS层到CMIS合规的避坑指南

本文为网络设备测试工程师和光通信研发人员提供了一份详尽的400G光模块测试实战指南。文章深入剖析了从PCS层信号完整性、FEC容限到CMIS管理接口合规性测试的全流程,并分享了ANLT协议分析、SerDes眼图调试以及系统级流量压力测试中的核心技巧与常见避坑点,旨在帮助读者构建一套高效、精准的测试体系,确保高速光模块的可靠性与性能。

weixin_29300931的博客 215

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

Unity半透明物体景深失效?教你用双材质球方案完美解决(附完整Shader代码)

本文深入剖析了Unity中半透明物体导致景深效果失效的根本原因,即半透明物体默认不写入摄像机深度图。针对此问题,文章详细介绍了稳定高效的“双材质球”解决方案,通过为物体附加一个仅写入深度信息的不可见材质,完美修复景深效果,并提供了完整的Shader代码与实现脚本。

weixin_29010003的博客 383

<PLC><西门子><工控>西门子博图V18中使用SCL语言编写一个CRC16-modbus校验程序

西门子官方对于SCL语言的介绍如下:SCL 编程语言SCL 编程语言SCL(Structured Control Language,结构化控制语言)是一种基于 PASCAL 的高级编程语言。这种语言基于标准DIN EN 61131-3(国际标准为 IEC 1131-3)。根据该标准,可对用于可编程逻辑控制器的编程语言进行标准化。SCL 编程语言实现了该标准中定义的 ST 语言 (结构化文本) 的PLCopen 初级水平。语言元素。

用沸腾的热血,支付我们的人生吧! 1439

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

【异常】Claude Code 400错误(Extra inputs are not permitted)解决方案

摘要:Claude Code 2.0.37+版本因API请求包含未支持的custom.input_examples参数导致400错误,使核心功能失效。解决方案是降级至稳定版v2.0.32:先卸载当前版本(npm uninstall -g @anthropic-ai/claude-code),再安装指定版本(npm install -g @anthropic-ai/claude-code@2.0.32),最后验证请求是否恢复正常。该问题确认在v2.0.32版本不存在。(148字)

奶爸的编程之路,也就一周冷个三天 2041

快速学习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

单光子雪崩二极管(SPAD):原理、极高增益机制与微光探测解析

本文系统阐述了单光子雪崩二极管(SPAD)的工作原理及其在弱光探测中的应用。SPAD通过工作在盖革模式下的碰撞离化效应实现单光子探测,其核心机理包括:1)采用p+-n-n+结构实现高电场分布;2)通过雪崩倍增过程获得10^6量级增益;3)采用主动/被动淬灭机制实现快速恢复。文章详细分析了SPAD的关键性能参数(如光子探测效率、暗计数率等)及其在量子通信、激光雷达等领域的应用优势,揭示了该器件在极微弱光信号探测中的独特价值。

Fun_LiDAR的博客 1047

php环境如何实现国密SM2相关功能

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1616

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

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

巴胡子 6913

巨正则蒙特卡洛—甲烷和二氧化碳的竞争吸附GCMC

巨正则蒙特卡洛—甲烷和二氧化碳的竞争吸附GCMC

Rockyoung 8022

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

老版QQ原生表情gif动态

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

用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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

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

weixin_36467693的博客 2675

3-1 郭老师的冰糖葫芦 c++

题目: 郭老师有草莓和山楂两种水果共计n个,她打算用这些水果做一串冰糖葫芦。她会把这串冰糖葫芦的水果组成用字符串的形式告诉你,其中’B’表示草莓,’W’表示山楂,例如:BBW,表示这串冰糖葫芦的水果按照顺序是草莓、草莓、山楂。郭老师想知道这串冰糖葫芦上的草莓串有几串,按照从左到右的顺序,这些草莓串的长度分别是多少?例如,冰糖葫芦WBBBBWWBWBBBW中共有3个草莓串它们的长度分别是4、1、3。...

qq_45788060的博客 1340

Python使用turtle画五环和糖葫芦

画五环 import turtle # 导入turtle库 turtle.width(10) # 设置画笔粗细为10 turtle.color("blue") # 设置画笔颜色为‘蓝色·’ turtle.circle(50) # 画圆半径为50 turtle.penup() # 抬起画笔 turtle.goto(120, 0) # 绝对坐标turtle.goto(x,y) turtle.color("black") # 设置画

ZikM的博客 3103

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

字符串通常有两种设计,一种是「字符」串,一种是「字节」串。「字符」串中的每个字都是定长的,而「字节」串中每个字是不定长的。Go 语言里的字符串是「字节」串,英文字符占用 1 个字节,非英文字符占多个字节。这意味着无法通过位置来快速定位出一个完整的字符来,而必须通过遍历的方式来逐个获取单个字符。 我们所说的字符通常是指 unicode 字符,你可以认为所有的英文和汉字在 unicode 字符集中都...

weixin_40581617的博客 375

python基于值得内存_为什么说Python采用的是基于值的内存管理模式

匿名用户1级2018-01-31 回答先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲(1)垃圾回收(2)引用计数(3)内存池机制一、垃圾回收:python不像C++,Java等语言一样,他们可以不用事先声明变量类型而直接对变量进行赋值。对Python语言来讲,对象的类型和内存都是在运行时确定的。这也是为什么我们称Python语言为动态类型的原因(这里我们把动态类型可以简单的归结为...

weixin_39618169的博客 558

python中画糖葫芦的代码_python简单爬虫(一)

学习python前纠结了下,到底是应该一个个知识点吃透,然后写些小程序。还是应该快速掌握基础语法,快速实践。思考后认为前者这么学习速度真心不高,于是花2天时间看了下python3的语法,虽然很多都不明白,但是带着小项目来学习直接解决问题。在项目中遇到问题,查阅一点点解决,这样很靠谱。在实现一个最简单的爬虫前,应该知道需要用到哪些东西?1.如果发送一个http请求,来抓取网页内容。2.如何方便的解析...

weixin_39606048的博客 1004
上一篇: 《快学 Go 语言》第 7 课 —— 冰糖葫芦串
下一篇: 《快学 Go 语言》第 8 课 —— 程序大厦是如何构建起来的
codehole_
博客等级 码龄7年 34粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值