Golang 语法速通指南(六)复合数据结构之切片(Slice)
本文重构于 Go 切片(Slice) Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,容量(cap)不够时会自动扩容 切片为引用类型,从数组中得到的切片修改元素值时,原数组也会发生变化,修改原数组时,切片也会变化 创建切片 创建切片可以有四种方法 使用 var 1var s []uint32 指定字面值 这样创建的切片长度和容量都等于初始元素个数 1s := []uint32{1, 2, 3} 使用 make() 函数 可以指定长度和容量,格式为make([]type, len[, cap]),可以只指定长度,也可以长度容量同时指定 123s1 := make([]uint32)s2 := make([]uint32, 1)s3 := make([]uint32, 1, 10) 使用截取符 可以从现成的数组或切片创建 12345var arr [10]uint32s1 := arr[0:5]s2 := arr[:5]s3 := arr[5:]s4 := arr[:] 访问切片 直接使用下标 使用截取符 使用 for k,v:= range s 添加元素 使用append()函数向切片中添加元素,可以一次添加 0 个或多个元素,如果容量不够会自动扩容 1234567s := make([]uint32, 0, 4)s = append(s, 1, 2, 3)fmt.Println(len(s), cap(s)) // 3 4...
写在10月的最后一天
最近有点忙,不配图了,就纯意识流,想到哪写到哪 前天刚把期中考考了,昨天杭助破冰大会,今天上午评讲期中试卷,下午阴间长跑刚跑完,累死,回来直接洗澡然后吃饭刷B站,现在状态还行,来水一篇博客 这个月 上大学的生活,平时就跟泡脚一样舒服 然后呢?等到最后的考试周,感觉就是让你把洗脚水喝下去一样 我感觉这十月,就跟一个学期一样:一开始放国庆非常舒服,到月末的考试,再折磨你一手 这个月最大的事情应该是完成了招新工作吧,国庆的录了个视频教新人怎么提交小任务,然后一起见面交流,月末团建助手生日会并一起吃饭 然后呢?国庆几天速成了 GORM 还有 go-zero 框架,然后就一直在搞面试系统(前后重构了好几次),后面就是准备大物考试和杭助节目了 对了,我还在咸鱼花 3000 整了个 iPad Air 5 ,之前一直想要的,但是举棋不定,新 iPad 发布当天全线涨价,二手必定会跟着涨,所以我就直接冲了,用到现在感觉没什么问题 学业 我能很负责地告诉你,圣光机自动化就是天坑专业 毛子讲课啥都听不懂,本来自动化东西就多,然后有些科目中文教学都挂一大堆人,何况是一堆专有名词的英文 然后呢?材料的 practice 教又不教清楚,那天我在 MATLAB 搞了一上午都没搞懂,做个 der 的作业,我还有一堆事情要做 然后呢?去找辅导员,第二天当面聊了一下,转专业是不可能的,这个合作办学情况特殊,然后课也是必须要听的,因为你要毕业 我只能说,命运真会捉弄,高考一考定终生的确不假,分数差了点被调剂到这个专业,每年交这么多钱学一堆我用不上的东西,关键是我还学不懂 如果没被调剂还好,计算机至少能学点相关...
『大学物理2』期中复习:波动光学
光的相干性与双缝干涉 光程和光程差 光强 杨氏双缝干涉 光的干涉 薄膜干涉 折射率大的是光疏介质 透射光没损失 牛顿环 光的衍射 单缝衍射 翻译 无质量弹簧 a spring of negligible mass 吸收 absorb 加速度 acceleration 振幅 amplitude 圆频率 angular frequency 波腹 antinode 静止的 at rest/stationary 平均寿命 average lifetime 亮条纹间距 bright stripe space 亮条纹 bright stripe/bright fringe 中央亮条纹 central bight fringe 相干源 coherent source 康普顿散射 Compton scattering 匀速 constant speed 干涉相长 constructive 坐标 coordinate 曲率半径 curvature radius 暗条纹 dark fring/dark stripe 干涉相消 destructive 对角线 diagonal 直径 diameter 传播方向 direction of propagation 电子 electron 发射光子 emission photon 发射 emit 能级结构 energy-level scheme 简谐运动方程 equation of motion 平衡位置 eq...
『大学物理2』期中复习:振动与波
简谐振动 知识点 运动方程 弹簧振子 弹簧的频率是其固有属性 旋转矢量表示法 振动中的圆频率:圆周运动的角速度 相位:矢量的辐角 速度方程 已知位置和速度求振幅 加速度方程 动能势能机械能 例题 求振动方程 简谐振动特征量 这个加速度貌似少了个负号 机械波 知识点 各种名词 机械波就是无数个质点接连做简谐振动,每一个时刻,下一个质点复制上一个质点的运动状态 什么波面波线平面波球波平面间谐波自己看课件 波动方程(波函数) 波形方程 波动方程把 ttt 确定就是那一时刻的波形方程(各个位置的 x−yx-yx−y 关系) 波动方程把 xxx 确定就是那一点的振动方程(那一点上的 t−yt-yt−y 关系) 例题 多普勒效应和波的叠加 多普勒效应 干涉 驻波 半波损失 半波损失:蓝色为入射波,你可能认为反射回来的是虚线,但实际上是红色,也就是貌似是向前半个波长再反射一样,然后混合起来是黑色,反射处正好是波节 半波损失在波疏介质到波密介质发生
『Ubuntu』记录两款服务/自启管理工具
chkservice 这东西是专门管理服务的 sysv-rc-conf 你可以很清晰地看见各个运行级的启动项 这两个就是直接 APT 就能下载,你可能会找不到然后需要添加 1deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse 然后很可能又有报错,但是一路查解决方法折腾下去就行了
『Go』初识 Flamego 框架的一些感受
昨天被拉去做苦力惹( 被拉去做苦力的一天,自己负责的项目一点没动,项目群里讨论得热闹非凡,负责人却被骗去其他项目帮忙了 一下午初识 Flamego ,之前感觉go-zero有点太死板了,现在又感觉 Flamego 有点过于灵活 Flamego 的话,感觉还是有点意思的,特别是那个依赖注入的方法,之前都没见过,有点意思 简单地说就是直接在初始化的时候使用 Map 直接传入,然后在需要的时候取出 最后看见这东西在 GitHub 上居然只有 400+ star,感觉有点不可思议 一问才知道性能不好,也确实 最后就是头一次见措辞这么奔放的的文档(乐
『hduhelp』如何在项目中接入助手 OAuth
书接上文,本篇记录一下如何在项目中使用助手鉴权 例子是我正在开发的面试系统,框架是 go-zero 示例地址: https://github.com/hduhelp/interview_backend/tree/9c05efb6a8614f79871876c0376a8d2cc123ceed (后面重构了,结构可能有变化) (私有仓库,需杭助内部身份) 先来看 API 文件 1234567891011121314151617181920212223syntax = "v1"// 目前仅测试杭助登录service user { @handler loginJump get /login/jump (loginJumpRequest) // 直接跳到杭助登录 @handler LoginCallback get /login/callback (LoginCallbackRequest) // 杭助登录回调}// 杭助登录回调type ( loginJumpRequest { From string `form:"from,optional"` } LoginCallbackRequest { Code string `form:"code"` // 杭助登录返回的code State string `form:"state"` // 杭助登录返回的state }) 可以看见,有两个路由: /login/jump...
GORM 入门笔记(十二)事务的使用与坑
普通事务 使用 Transaction() 可以开启事务,在其中传入一个签名为 func(tx *gorm.DB) error 的函数,在函数内操作,如果返回的 error 不为空,则这些操作都作废 1234567GLOBAL_DB.Transaction( func(tx *gorm.DB) error { // 在这里做些事情 // tx.Create(...) return nil}) 事务可以嵌套,如果内部事务出错,只会回滚内部语句 手动事务 另外一种形式是手动事务 1234567tx := GLOBAL_DB.Begin() // 开启事务// 在这里做些事情// tx.Create(...)tx.Rollback() // 回滚事务(直接回到初始点,上面的都作废)// 在这里做些事情// tx.Create(...)tx.Commit() // 提交事务 进阶一点的操作是设置存档点,还有手动回档 1234567tx := GLOBAL_DB.Begin() // 开启事务// ...tx.SavePoint("savepoint1") // 创建保存点// ...tx.RollbackTo("savepoint1") // 回滚到保存点// ...tx.Commit() // 提交事务 坑 GORM 的事务在多协程场景下貌似手动上锁,请见gorm的坑
GORM 入门笔记(十一)关联标签
在官网的实体关联底部有一个表格,讲的是关联标签 标签 描述 foreignKey 指定当前模型的列作为连接表的外键 references 指定引用表的列名,其将被映射为连接表外键 polymorphic 指定多态类型,比如模型名 polymorphicValue 指定多态值、默认表名 many2many 指定连接表表名 joinForeignKey 指定连接表的外键列名,其将被映射到当前表 joinReferences 指定连接表的外键列名,其将被映射到引用表 constraint 关系约束,例如:OnUpdate、OnDelete 关联标签可以自定义创建关联的时候,使用哪些列作为外键之类的( 其中有几个已经讲过了,然后最后一个一般不用,剩下的 4 个再挑出来讲一讲 foreignKey 与 references 还是用老师学生举例 12345678910111213141516171819202122232425262728293031323334353637383940414243package maintype Info struct { Id int Score int StudentID int}type Student struct { Id int Name string Info Info TeacherID int}type Teacher struct { Id int Name string // has many Student []S...
GORM 入门笔记(十)自引用
自引用的话比较简单 ,这一篇就是用来水的 书接上文,现在需要实现评论的评论,怎么办? 很简单,只需这样 12345678910111213type Comment struct { Id int Body string Comments []Comment `gorm:"polymorphic:Owner;"` OwnerID int // 拥有者ID OwnerType string // 拥有者类型}// 添加评论func AddComment(Body string, OwnerID int, OwnerType string) { GLOBAL_DB.Create(&Comment{Body: Body, OwnerID: OwnerID, OwnerType: OwnerType})}
GORM 入门笔记(九)多态的概念与使用
概念 多态只存在于 Has One 和 Has Mang 中,这东西有些难以表述,我尽力讲得比较清晰 假如你正在开发一个类 B 站平台,平台上可以上传视频,也可以发布文章 现在需要加入评论功能,你将如何设计评论表? 众所周知,视频是可以评论的,文章也是可以评论的 (暂时不考虑评论的评论) 最简单的方式就是以视频表的主键为外键,建一个视频评论表,再另外以文章表的主键为外键,建一个文章评论表 也就是说,视频 has many 视频评论,文章 has many 文章评论,两种评论互不相干 但是,这就搞出来两张表,搞出来两种评论类型,有没有一种关联模式,能在一张表中存储所有评论呢? 或者在某些场景下,不止 A 和 B 要拥有某一类的东西,而有 ABCDEF… 那怎么办? 那自然是有的,在这里只需这样设计评论表 字段1:自增主键 字段2:评论内容 字段3:拥有者的 ID (这个拥有者可以是指视频,也可以是指文章) 字段4:拥有者类型(视频/文章)(A/B/C/D/E/F…) 这就是多态,感觉就像是可以同时以多个表作为外键,但每一条数据都只被一个拥有者拥有 (多说一句,多态仅仅是 GORM 完成的,数据库中并没有外键索引约束) 使用方法 还是接上面的视频与文章的例子,假设它们的原始模型如下 1234567891011type Video struct { Id int Title string URL string}type Post struct { Id int Title string Body string} 假...
『Linux』一个多月来将 Ubuntu 22.04 作为主力系统的感想
嗯,如你所见,我现在已经把 Linux 当做主力系统一个多月了 先说结论:我感觉还不错! 事情的起因 啊,是这样的,就是因为我受不了 Windows 了 详情可以看 『随笔』写在新学年伊始 折腾过程 安装 首先就是决定用哪个发行版,我把主流的都试了一遍,然后发现 很明显,我除了 Debain 系,没有其他的选择 因为我真的 apt 用惯了 Debian 太简陋了,Deepin 一股国产味道,我最后选择了 Ubuntu 至于安装的过程嘛,先去官网找镜像,然后用 rufus 写到 U 盘里面,或者用 ventoy 也可以 Linux 现在在安装的时候都很贴心地给出了与 Windows 共存的选项 软件 对于 Linux ,过去一个很重要的问题就是日常软件的适配 但是现在已经 2022 年了,这种情况已经得到了很大的改观 我大概总结了一下我目前的应用 能原生运行的有: edge、钉钉、飞书、网易云音乐、WPS、VSCode、JB 全家桶、Apifox、Typero、PicGo、Clash、VLC、搜狗输入法、OBS等 需要转译的有: QQ/TIM、微信 可以看见,大多数应用都支持了 Linux ,但是就是憨憨腾讯,点名批评哇~~(2020年出的那个垃圾 QQ Linux 版就憋说了~~ 对于 QQ/TIM 的话,crossover 可以勉强用,deepin-wine 也可以勉强用,平时可以用 lcalingua++ 代替 对于微信的话,crossover 和 deepin-wine 表现都可以 美化 美化的话,用的是仿 mac 的 WhiteSur-gtk-...
GORM 入门笔记(八)多对多关联(Many To Many)
Many To Many(多对多) 如果你一对多关系搞懂了的话,多对多其实也很容易 123456789101112131415type Student struct { Id int Name string // many2many Teachers []Teacher `gorm:"many2many:student_teachers;"`}type Teacher struct { Id int Name string // many2many Students []Student `gorm:"many2many:student_teachers"`} 就是互相放对方的切片嘛,但是这个关系交给一个第三方表来记录,所以需要加一个 tag 然后建表,可以看见建了三个表 1GLOBAL_DB.AutoMigrate(&Student{}, &Teacher{}) 创建 这个应该很简单了 1234567teacher1 := Teacher{Name: "teacher1"}teacher2 := Teacher{Name: "teacher2"}student1 := Student{ Name: "student1", Teachers: []Teacher{t...
『JWT』在 go-zero 框架中使用 JWT 鉴权
今天刚搞懂了这东西,睡前一定要记下来 首先一定要对 go-zero 和 JWT 有些基础,不然你大概不知道我在 BB 什么 建议把官网上的 demo 都跑一下 我以一个单体服务开始讲,以下是 api 文件 12345678910111213141516171819202122232425262728293031323334syntax = "v1"service user { @handler login get /login(LoginRequest) returns (LoginReply)}@server( jwt: Auth)service user { @handler userInfo get /user_info(UserInfoRequest) returns (UserInfoReply)}// 目前仅测试 JWT 功能,能否从 token 中获取 user_typetype ( // 登录服务 LoginRequest { UserType uint8 `form:"user_type"` } LoginReply { Token string `json:"token"` } // 用户信息 UserInfoRequest { } UserInfoReply { UserType uint8 `json:"user_type"` }) 为了简洁,...
GORM 入门笔记(七)一对多关联(Has Many)与进阶预加载
Has Many(一对多) 官网地址:https://gorm.io/zh_CN/docs/has_many.html 先回忆一下 Has One 的表达 123456789101112131415type Student struct { Id int Name string // has one TeacherID int}type Teacher struct { Id int Name string // has one Student Student} 然后现在是 Has Many 嘛,一个 teacher 必定不止有一个 student 所以 Student 应该是一个切片 1234567891011121314type Student struct { Id int Name string TeacherID int}type Teacher struct { Id int Name string // has many Student []Student} 然后创建表 1GLOBAL_DB.AutoMigrate(&Student{}, &Teacher{}) 可以看见,数据库中的结构与 Has One 的是一样的 也不难理解,Has Many 只是能让多个学生指向同一个老师而已 创建 现在尝试一下使用 Has Many 的创建 123456789101112stud...
GORM 入门笔记(六)一对一关联(Belongs To 与 Has One)、初识预加载与关系操作
首先准备两个结构体:学生和老师 123456789type Student struct { Id int Name string}type Teacher struct { Id int Name string} 然后自动建表 123func One2one() { GLOBAL_DB.AutoMigrate(&Student{}, &Teacher{})} 你会发现两张表都能被建出来,但是相互没有关联 下面来创建一对一关联 PS:Belongs To 和 Has One 在数据库是一样的,只是本地的代码结构不同 Belongs To(属于) 要说明某个学生属于某个老师,可以在 Student 中加上一个老师的 Id 和一个实例 12345678910111213type Student struct { Id int Name string // belongs to TeacherId int Teacher Teacher}type Teacher struct { Id int Name string} 这时就只需要用 Student 来建表了,清空数据库并重新建表 123func One2one() { GLOBAL_DB.AutoMigrate(&Student{})} 你可以看见, GORM 自动将学生和老师都建好了,并且学生有一...