深入Go语言——内存
前言关于内存部分的内容,是正在读的书中的第三部分,这一部分讲的是Go语言中的指针相关的知识,由于书中花费了一定篇幅去讲过于内存的问题,所以本周的总结报告命题为”内存“。
这并不是第三周全部学到的东西,只是开始,由于我现在还不能把学到的东西随手记录下来,所以选择先写一篇学习总结。我详细一篇应该是关于项目实战的。
学习思考指针提到指针,我们并不陌生,从开始学习程序设计就已经接触到了指针。对我来说,指针是一个既熟悉又陌生的东西。熟悉是因为在最开始的学习时,我和同学不止一次地讨论过指针也进行了一定的学习。陌生是因为我确实不是很喜欢学习C语言,以至于其真正的核心内容我学的都不扎实,学了就忘。
在Go语言中,由于变量分为值类型和引用类型,使得指针在函数传参的时候有了用处。对于值类型的变量而言,当函数的参数是指针类型时,函数对该参数的修改才会影响到该参数本身。
指针接收者对于是否使用指针类型作为接收者,有以下几点参考:
如果接收者类型是 map、slice、channel 这类引用类型,不使用指针。
如果需要修改接收者,那么需要使用指针。
如果接收者是比较大的类型,可以考虑使用指针,因为内存拷员 ...
Go语言进阶——并发
前言本周是正式系统性学习整理Go语言的第二周,上周把基础知识学过后,这周开始学习进阶知识。说到Go语言的特性,那就是高并发,所以进阶学习的第一部分只是就是关于并发的。总结内容和之前一样,并不会过多的记录书本里的东西,更多的是这一周学习的困难和解决的过程。
学习思考本周学习内容主要有两个部分,并发基础和算法,学习这些的原因是因为最近开始找实习了,发现确实落下了太多东西。
什么是并发第一次了解并发是在学习计算机系统的时候,不再只让计算机做完一件事之后再开始做另外一件事,而是让计算机同时做多件事情,这就是并发。
说到并发就一定绕不开两个概念——进程和线程。
在启动一个软件的时候,操作系统会为这个软件创建一个进程,这个进程就是该软件的工作空间,它包含了软件运行所需的所有资源。
线程是进程的执行空间,一个进程可以有多个线程,线程被操作系统调度执行。
一个程序启动就会有一个进程被创建,同时进程也会启动一个线程,这个线程被称为主线程,如果主线程结束,那么整个程序就退出了。有了主线程,就可以从主线程里启动很多其他线程,也就有了多线程的并发。
在Go语言中并没有线程的概念,只有协程,也成为 gor ...
打开Go语言之门
前言开始学习Go语言已经差不多半年了,这是第一次正式写下一篇学习总结。又恰逢新学期开始,就把这篇当作新学期的第一篇周报吧。
本周主要是把半年来稀稀拉拉学到的Go语言基础知识有系统性地看了一遍。我对Go语言的了解更多还是从我的舍友,也正是受到他的影响我才会开始学习Go语言并进行记录。
这一周的学习内容就像本文的标签一样,Go语言基础。因为已经学习了很久,所以基础知识就不再本文中赘述。
学习思考关于Go语言的学习,笔者已经看了四五本不同的基础书籍了,每本书的开头都是以Go语言的优点来开篇,那2024年的第一篇博客也从这个问题开始吧。
Go语言好在哪?说到Go语言的好处,想必都能想到什么简洁、高效等等。而真正吸引我开始学习Go语言的,还是我的舍友告诉我Go语言的代码有着严格的格式要求,不同人写的代码排版风格几乎一致,这一下就激起我学习Go语言的兴趣。因为笔者在刚开始学习编程的时候并没有养成良好的代码习惯,导致我的代码在很长一段时间里都只有我自己看得懂,于是迫切找到一个大家代码风格都差不多的语言重新开始学习。随着后来对Go的学习,我也了解到它更多的优点。接下来我们来看一下Go语言到底好在哪?
...
什么是命名空间(namespace)
前言想必大家在初学C++时就已经发现了这样一个现象:一些代码前面要加上 std:: 或者在头文件后用 using namespce std;来代替。已经学习C++两年的我在最开始发现这一问题时选择了最简单的方法来理解这一现象,那就是“记住就好了,就应该是这样的”。
直到最近在阅读《程序员的自我修养》这本书的时候又一次看到了 namespace 这一词,这次它以一个全新的名字出现在我的眼前——命名空间。在查询了资料过后,才解开了这个困惑。
什么是命名空间命名空间(Namespace)是编程语言中用于标识符(变量、函数、类、对象等)命名的一种机制,它可以防止命名冲突和提供更好的代码组织方式。在不同的上下文中,同一个名字可能会被用来表示不同的实体,这时候通过命名空间可以区分它们,避免混淆。
我们假设一个C++文件是一个城市,在这个城市里有很多人都叫“张伟”,如果我们除了他们的名字以外对他们没有任何了解,那么当我们叫张伟这个名字时,编译器并不知道是哪一个张伟。更何况我们叫的这个名字,在别的城市(引入的其他头文件)也有。
为了更好分清楚他们,我们将收集更多关于这些人的个人信息,如家庭住址、年龄 ...
Bomb Lab
Bomb Lab简介这是HNU计算机系统课程的第三次实验,实验要求是给一个用C语言编写的可执行文件bomb,你可以看到它主函数的C语言代码,除此之外,一概不知,实验分为六个阶段,每个阶段需要输入一串字符,以此来破译炸弹的密码,如果六次输入的密码都是正确的,则炸弹拆除,否则炸弹爆炸(退出并打印爆炸信息)。为了防止学生互相借鉴,HNU采用了最传统的防作弊方式——让每个学生做不同的题目。这次实验好行并没有什么评分标准,所以可以不断测试自己的答案。
C语言源代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261 ...
小孔成像模型——坐标系转换
本文主要记录在三维空间的物体转换为二维图像的过程,即相机的投影过程。
本文主要记录在三维空间的物体转换为二维图像的过程,即相机的投影过程。
一、小孔成像模型与坐标系相机的拍摄过程可以简化为小孔成像的一种形式,利用这种形式很容易就能得到相机模型中的数学表达式。通过相机的成像方式及其数学表达式,可以看出三维场景和图像中每一个像素之间的映射关系。
相机的模型结构如下图所示,为了使其简单化,把成像的平面置于小孔前面,并且拍摄出来的图像也应该是正立的。
在小孔成像模型中,场景从三维空间投影到图片上的整个过程可以理解为三个步骤和四个坐标系。
具体流程如下:从世界坐标系转换到相机坐标系,再从相机坐标系转换到图像坐标系,最后从图像坐标系转换到像素坐标系。
四个坐标系的定义如下:
世界坐标系:一个客观的绝对存在,世界坐标系都需要预先确定,指定其原点和方向。在定义好的世界坐标系中可以放置任何物体。世界坐标系下的坐标通常用(Xw,Yw,Zw)来进行表示。
相机坐标系:目前通用的定义方法是以一台相机的光心或者主点作为坐标系的原点。X轴和Y轴在拍摄画面时分别平行于图像的横轴和纵轴,Z轴为相机的焦距所指方向。 ...