获得徽章 0
#青训营 x 字节后端训练营#
打卡day14
今天是结课的日子,之后就可以专心备战期末周了。希望在这个暑假可以完成一个go语言的项目
奥利给!
评论
#青训营 x 字节后端训练营#
打卡day13
今天阅读了关于for-range的一些易错点
总的来说值得注意的有以下两点:
在循环开始前,会将数组或切片赋值给一个新变量,在赋值过程中就发生了拷贝,迭代的实际上是副本。
在循环过程中,会将迭代元素赋值给一个临时变量,这又发生了拷贝。如果取地址的话,每次都是一样的,都是临时变量的地址。
展开
评论
#青训营 x 字节后端训练营#
打卡day12
今天阅读了为什么rust和go会放弃继承,选择组合
继承和组合是面向对象编程中两种常见的代码重用方式。它们都可以实现代码的复用。两者最大的区别是继承关系的耦合度高,子类和父类之间是紧密耦合的关系。而组合对象之间的关系是松散的,修改一个对象不会影响到其他对象
在实际使用中,继承会遇到这样的问题:要设计一个关于车的类。按照面向对象编程的思想,我们将“车类”这样一个事务抽象成一个BaseCar类,默认有run的行为。那么所有车类都可以继承这个抽象类。比如,汽车,卡车等。上面的设计有三个隐患:
第一个,如果把基类的行为实现都放到基类里面,虽然能提高复用性,但是也会改变所有子类的功能,这也会导致代码的复杂性提升。
第二个点是,对于没有没有那些功能的对象,比如自行车,就不应该把修引擎的功能暴露到自行车类里面。
第三个点是,如果扩展到其他对象怎么办,比如说人也会跑,飞机也会跑。那么这个设计后面就不好扩展了,也不够灵活。
但其实我们可以通过先实现接口,然后通过组合、委托的方式来解决。这样代码就会清爽很多。
展开
评论
#青训营 x 字节后端训练营#
day11
今天阅读学习了go的静态编译机制
go程序是通过 runtime 这个库实现与操作内核系统交互的。go自己实现了 runtime,并封装了syscall,为不同平台上的用户层面代码提供封装完成的、统一的go标准库。
go默认情况下是采取的静态编译,在编译时会将依赖库一起编译进二进制文件,所以go编译出来的二进制文件比 C 语言编译出来的文件会大的多
同时go语言也提供 Cgo,可以用以在 Go 语言中调用 C语言库。当使用 Cgo 进行构建时,如果我们使用的包里用着使用 C 语言支持的代码,那么最终编译的可执行文件都是要有外部依赖的。这样不可避免会使用一些外部的动态链接库。
如果要使我们编译的程序有着更好的可移植性,可以进行纯静态编译。有两种方式可以帮助我们进行纯静态编译:CGO_ENABLED=0(关闭cgo);采用external linker
展开
评论
#青训营 x 字节后端训练营#
打卡day10
今天学习了http框架
其使用 TCP 协议,通过网页浏览器、网络爬虫或者其它的工具,客户端(user agent,用户代理程序)发起一个 HTTP 请求到服务器上指定端口(默认端口为80)。
应答的服务器(origin server)上存储着一些资源,比如 HTML 文件和图像,服务器在那个端口监听客户端的请求。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。
一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。
每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。HTTP/2 中的连接具有复用性,即每个目标地址建立连接后,可以永久被利用,所以每个来源仅需要一个连接。
展开
评论
#青训营 x 字节后端训练营#
打卡day9
今天粗浅学习了go性能调优
以下是优化的大致流程:
1.建立服务性能评估手段
2.分析性能数据,定位性能瓶颈
3.重点优化项改造
4.优化效果验证
(期末周ORZ,完全没空细看ToT)
展开
评论
#青训营 x 字节后端训练营#
打卡day8
今天学习了Go语言引入的新型排序算法pdqsort
pdqsort (pattern-defeating-quicksort)是一种不稳定的混合排序算法,它的不同版本被应用在C++ BOOST、Rust 以及Go 1.19中。它对常见的序列类型做了特殊的优化,使得在不同条件下都拥有不错的性能。
最后也复习了之前在数据结构中学习过的各种经典的排序算法,如quicksort、heapsort等
展开
评论
#青训营 x 字节后端训练营#
打卡day7
今天学习的内容比较轻松,主要是了解了一下公司中后端的开发流程。
后端开发流程是指在软件开发生命周期中,从需求分析到部署上线,后端开发人员所需要遵循的一系列规范和流程。一个高效的后端开发流程可以帮助团队提高开发效率,降低开发成本,提高软件质量,保证软件按时上线。
后端开发流程包含以下几个阶段:
需求分析:在这个阶段,开发团队需要对客户需求进行深入分析,明确软件功能和性能等要求,并将其转化为开发可理解的技术需求。
设计阶段:在这个阶段,开发人员将需求分析阶段确定的技术需求转化为具体的设计方案,包括数据模型、接口设计、数据存储设计等。
编码阶段:在这个阶段,开发人员开始根据设计方案进行具体的编码实现,其中需要遵循一系列的编码规范和标准。
测试阶段:在这个阶段,开发人员需要进行单元测试、集成测试、系统测试、性能测试等一系列测试,确保代码的正确性和稳定性。
部署上线:在测试阶段通过后,将代码部署到生产环境中并上线。
展开
评论
#青训营 x 字节后端训练营#
打卡day6
今天学习了中间件——消息队列的有关知识。
消息队列在实际应用中包括:应用耦合、异步处理、限流削峰、消息驱动的系统。
之后学习了消息队列的点对点模式:消息发送者生产消息发送到queue中,然后消息接收者从queue中取出并且消费消息。消息被消费以后,queue中不再有存储,所以消息接收者不可能消费到已经被消费的消息。同时也学习了消息队列的发布模式:发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
最后学习了热门的Kafka消息队列、BMQ以及RockeMQ
展开
评论
#青训营 x 字节后端训练营#
打卡day5
今天复习了git的相关知识并且学习了一些细节。
之前使用的一般都是http方式拉取远程库等,今天过了一遍ssh方式。
把git中一些文件的作用了解了一下。
最重要的是把之前理解的不清晰的branch相关知识重新学习梳理了一遍。
展开
评论
#青训营 x 字节后端训练营#
打卡day4
今天阅读了有关DSN和连接池的内容。
DSN是一串代表了连接地址的字符串,它一般都有对应的结构体(比如driver mysql里面就有,可以给open传一个connection结构体,而非字符串)。DSN被分为两种类型:machine DSNs,file DSNs。
而连接池就是一个封装,其在内部对象池维护一定数量的数据库连接,对外暴露获取和放回的方法。其目的是利用连接重用,降低频繁开启和关闭连接的开销,同时加快响应、防止资源泄漏。以mysql的连接池结构体DB为例,其中最重要的参数有:maxIdleTime(最大空闲时间),maxOpen(最大连接数,0代表无限制),maxLifetime(最长生命时间)等。重要的方法有:SetConnMaxIdleTime,SetConnMaxLifetime等。我们可以通过Status方法获取连接池状态。
展开
评论
#青训营 x 字节后端训练营#
打卡day03
今天主要学习了数据库的一些概念和主要产品。
首先是存储系统和数据库的区别。存储系统是用于存储数据的硬件和软件系统。它的主要目的是提供大容量的存储空间,以便用户能够保存大量的数据。而数据库系统是一种用于组织,存储和管理数据的软件系统,分为关系型数据库和非关系型数据库。
之后了解了文件存储、key-value存储、分布式存储、单机数据库(Mysql,Oracle,reddis等)、分布式数据库。
准备在之后写项目的时候仔细熟悉一下SQL的查询语法。
展开
评论
#青训营 x 字节后端训练营#
打卡day2
今天学习了想要做一个互联网项目大致的步骤,这里以课程视频中的实践项目为例。
首先需要进行需求设计,其中要注意将大需求划分为小需求。分析一下底层的数据结构是什么样的,进而设计出需要的类,如实践项目需要设计一个topic类,一个post类以及user类。将结构分层,如数据层(repository layer),逻辑层(service layer),视图层(controller layer)。数据层负责外部的增删改查,将各种来源的数据封装,返回提供统一的接口给逻辑层。逻辑层实现核心业务逻辑输出。视图层处理和外部的交互逻辑,比如转换输入字符串,将输出转换成json格式等。
接下来回顾一下今天学习到的一些小要点。每个类往往配备一个Dao类,这是一个方法类,其方法包含了对类的所有查询。其实现会用到sync.Once,来保证这个类的对象只会被创建一次,每次查询都会使用到它。回顾了defer的用法,即将语句压栈,在函数执行完后会弹出执行。用sync.WaitGroup来保证子协程都完成,并且不会造成时间浪费。
展开
评论
#青训营 x 字节后端训练营#
打卡day1
今天学习了go1.11开始的全新包管理模式。通过go.mod文件,每一个项目的依赖都被详细记录。第三方包将会被下载到$GOPATH/pkg/mod路径下。在此路径下,每个依赖包都同时记录有自己的版本号,这样的机制使得同一依赖包的不同版本可以同时存在。(在这个机制出现之前,需要通过gopath来维护全局的依赖包,很容易造成版本冲突。如果要给项目制定仅本地使用的包,需要使用vendor等工具,十分复杂)。现在只需要go tidy一下就可以完成所有包相关的下载和配置。
其次还学习了闭包。go语言中将函数看作变量,例如x:=func,x就成为了一个函数变量,可以用x(1)效果和func(1)相同。闭包是由函数和与其相关的引用环境组合而成的实体,比如说函数嵌套后进行赋值,就有可能产生闭包。在我的理解中,就是函数引用了其外部的变量,使得变量的生命周期被人为延长了。这往往会导致许多函数引用了同一个变量,解决方法可以是在函数外嵌套一个新的匿名函数。
展开
评论
@西安交通大学
下一页
个人成就
文章被点赞 5
文章被阅读 665
掘力值 59
收藏集
0
关注标签
0
加入于