Golang 语法速通指南(四)基本数据类型之字符串
定义
有的人说 Golang = C + Python ,这句话不假,像函数、数值变量的类型等都能看见 C 的影子,而 Go 中最像 Python 的地方就是字符串了
1s := "hello, world"
访问
这点和 Python 一模一样
使用索引
1fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w')
使用切片
1234fmt.Println(s[0:5]) // "hello"fmt.Println(s[:5]) // "hello"fmt.Println(s[7:]) // "world"fmt.Println(s[:]) // "hello, world"
运算符
使用 + 可以连接两个字符串
1fmt.Println("goodbye" + s[5:]) // "goodbye, world"
比较大小也与 Python 中的相同
1println("123" > "120000") // True
编辑
和 Python 一样,字符串是不能手动编辑的,那么如果你真的想编辑的话,可以将其转换成 byte 的切片,然后再编辑
12345var a = "hello"var b = []byte(a)b[0] = 'H'a = str ...
Golang 语法速通指南(三)基本数据类型之数字
Golang 中的数字包括整型(整数)、实型(浮点数)、复数、布尔型和常量,下面就分别来解释它们
整型
众所周知 C/C++ 中对于一般整型使用的关键字是 short 、int 、long 、long long 之类的,而 Go 中直接根据占用的 bit 大小命名为 int8、int16、int32 和 int64
而对于一票带 unsigned 关键字的无符号整型,就直接命名为 uint8、uint16、uint32 和 uint64
那么在 Go 中有没有 int 呢?答案是有的
Go 中还有 int 和 uint,它们的大小根据实际软硬件平台不同而不同,一般是 32 bit,日常来说完全够用,但是要记住 int 和 int32 必须显式地转换,即使它们的大小一般是相同的
还有有两种衍生类型需要了解:
rune :与 int32 等价,用于表示一个 Unicode 码点
byte :与 uint8 等价,一般用于强调数值是一个原始的数据而不是一个小的整数
还有一种特殊的类型 uintptr ,它没有指定的大小,用来保存指针,只在底层编程时用到,一般见不到
实型
Go 中的浮点数只有 float32 和 float64 两种,一般情况下建议直接使用 float64,它们都向下兼容 C/C++ 中的用法
不过 Go 中的数学运算与 C 中的有一些不同:
算术和逻辑运算的二元操作中必须是相同的类型,也就是说不会像 C 一样隐式转换(浮点数等同理)
Go 在 math 包中添加了 IEEE754 浮点数标准中定义的特殊值:正无穷大和负无穷大(+Inf 和 -Inf ,用 ...
微信小程序开发基础(七)组件之swiper轮播组件
本篇的主要内容就是 swiper 组件,它可以实现首页上方的滚动视图
首先新建一个页面,基本的框架就是<swiper>内嵌很多<swiper-item>
12345<swiper> <swiper-item>111</swiper-item> <swiper-item>222</swiper-item> <swiper-item>333</swiper-item></swiper>
这实在是过于方便了,现在去找三张图加进去
1234567891011<swiper> <swiper-item> <image src="/images/1.jpg"></image> </swiper-item> <swiper-item> <image src="/images/2.jpg"></image> </swiper-item> <swiper-item> <image src="/images/3.jpg"></image> </swiper-item></swiper>
但是很明显,图片并没有按正常比例显示
稍微修改一下样式
1234567891011<swiper class="b ...
Golang 语法速通指南(二)程序结构
让我们从最简单的 HelloWorld 开始理解
1234567package mainimport "fmt"func main() { fmt.Println("Hello, World!")}
包
声明包
每个 Go 程序都是由包构成的,每个项目都是从 main 包开始运行,最开头的 package main 声明了我们当前在 main 包中
导入包
使用 import 语句来导入包,例如这里导入了 fmt 包,并且在 main 函数中使用了它的函数 Println
在需要导入多个包,可以使用多个 import 语句
12import "fmt"import "math"
也可以选择使用括号括起来
1234import ( "fmt" "math")
导出名
在语言中,常使用 public 和 private 关键字来说明一个对象是公用的还是私有的(对外是否可见)
而在 Go 中则简单地使用首字母大小写来表示这一点,如果一个名字以大写字母开头,那么它就是已导出的(外部可见),这一点在很多地方都能体现,例如包中的函数和结构体中的元素
这也解释了为什么Println 的首字母是大写的
让我们实操一下:
在项目中新建 .\sayhello\sayhello.go
1234567package sayhelloimport "fmt"func Say(name string) { fmt.Println(&quo ...
Golang 语法速通指南(一)环境搭建
Golang 的开发环境可以有很多,比如 VSCode 等,但我下面说的方法是我感觉最省心省力的,也是我们社团中最为推荐的,那就是使用 GoLand
安装 GoLand
目前来说,Golang的最佳 IDE 是喷气大脑出的 GoLand,可以使用它直接搞定所有环境
个人建议通过他家的 Toolbox App 下载最方便
安装完成后,找到 GoLand
关于注册,你可以在官网认证你的学生身份,然后直接白嫖
安装完成后,你可以在设置中安装一个中文语言包
个人建议在设置里配一下代理,它是不吃全局代理的
安装 Golang
直接在 GoLand 的设置的 GOROOT 里下载你想要的版本,不需要跑一遍官网
安装后,你可以手动把它加到 PATH 里去
Hello,World!
新建一个项目,把下面这段代码复制进去
1234567package mainimport "fmt"func main() { fmt.Println("Hello, World!")}
然后按下 Alt +F12 打开终端,切到你的项目目录,执行下面的语句
12go mod init maingo mod tidy
之后点击右上角的箭头执行
如果没法正常运行,可以参照我的配置
至此,环境配置完毕
Golang 语法速通指南(〇)前言
❤️又开新坑了!!!
关于本系列
最近青训营要开营了,一想起我学的七七八八的 Golang,都感觉不配跟大佬一起做项目,特地速速复习一遍,顺便写成博客 (不写博客真的第二天就又忘了)
关于 Golang
Golang 是一门在 2009 年推出的新的类 C 系语言,个人认为可以看成是 C 在 21 世纪的升级版本,它真的非常优秀,改进了 C 的很多方面,个人总结了以下几点:
更安全:例如在 C 中,新声明的变量内容是不确定的,但是在 Go 中,它们都为空
更智能:体现在回收机制和堆栈分配,切片自动增长等
更规范:更加规范你的码风,声明了变量而不用会报错,引入了包不用也会报错,甚至大括号不是 C 风格也会报错
更现代:例如在 C 中函数返回值只能是一个值,但是 Go 中可以为多个,例如可以在 for 中使用类 Python 的 range 等,还加入了一些面向对象的元素,还有并发、信道等新功能
整体目录
环境搭建
程序结构
基本数据类型(数字、字符串)
复合数据类型(数组、切片、映射、结构体)
函数
方法与接口
并发与信道
测试
反射
重点参考文献
Go 语言之旅
Go 语言圣经(中文版)
Python 入门笔记(十)函数
定义函数
Python 最大的特色之一就是用缩进来表示层级关系,所以与 C/C++ 不同,它没有大括号,标准的定义格式如下:
123def 函数名(参数列表): 函数体 return 返回值
有几点说明:
不要忘记冒号
与 C/C++ 相同,可以没有返回值,甚至可以没有 return 语句,在末尾自动返回
如果传入的是可变数据(列表、字典和集合),那么对它们的修改是永久的,你可以使用切片([:])或深拷贝来规避这一特性
不要混用 Tab 和空格,虽然有时它们看起来是一样的,这会让程序无法运行
简单的例子:
123def area(width, height): return width * heightprint(area(3,4)) # 12
传递参数
因为 Python 中没有指针这种概念,所以没有地址传递这一说,如果是不可变类型就是值传递,可变类型就是引用传递
但是传参的写法对比 C/C++ 有了一些创新
位置实参
这就是类 C/C++ 的写法了,最普通常见的写法
1234def makeFullName(firstName, lastName): return firstName + " " + lastNameprint(makeFullName("John", "Smith")) # John Smith
关键字实参
在调用时手动指定形参的名称
12345def makeFullName(firstName, lastName): return firstName + ...
Python 入门笔记(九)推导式
前面我们讲了 Python 中的几种高级数据类型(列表、字典、集合、元组)
推导式就是一个工具,能构建一种函数关系,从现有对象推导出新对象
而根据新对象的类型,推导式也分为列表推导式、字典推导式、集合推导式和元组推导式
语言的描述总是不够的,最好的理解方式就是来看代码
列表推导式
基本结构:
1[表达式 for 某元素 in 某对象 if 条件]
它的含义是通过 for 结构枚举出每个元素,然后利用表达式生成新的元素,表达式可以是调用自身的方法,也可以是函数,而条件是可选的,可以过滤列表中不符合条件的值
例1:过滤掉长度小于或等于 3 的字符串列表,并将剩下的转换成大写字母
1234>>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith']>>> new_names = [name.upper() for name in names if len(name)>3]>>> print(new_names)['ALICE', 'JERRY', 'WENDY', 'SMITH']
例2:计算 30 以内可以被 3 整除的整数
123>>> multiples = [i for i in range(30) if i % 3 == 0]>>> ...
『实记』“韵味杭州”测试赛球童志愿经历
知道我为什么又停更了几天嘛~ 那必是去办大事去了~
不得不说,这几天是真的开心,简直要乐死我了
在我看见这个请假证明的时候,就知道接下来这几天必定是非常令人难忘的
首先让我先交待一下背景:鄙人是一名预选的亚运会网球球童志愿者,具体工作就是在场上传球、捡球、给运动员撑伞、供球之类的,但是其实也没有那么简单,网球规则还是有点复杂的,具体可以看这一篇。然后新人肯定不能直接去服务亚运会嘛,必是要先试炼一下,这个测试赛就是我们锻炼的好机会。这场测试赛的运动员其实都是些几岁的小学生,心理负担不会太大,是一次很好的锻炼机会
17号的培训会
20号的场地培训及赛前适应场地
本场比赛一个有好几个场地,分别是 CC(Center Court,也就是上面的那张图,决赛场),C1(半决赛场),还有后面的 C3、C4、C5 和 C6(这几个是连着一起的)
DAY 0(21日)
这一天是赛前最后的准备日,中午上完课之后,我们就出发了
出发啦!
在酒店报道
入住房间
然后我们接着前往奥体中心,在休息室开会,熟悉明天的场地,还要领发放的衣服
我们 4 组明天要和 3 组去 C1 场,两个小组轮换,练习了好久的传球,还有上场和退场。但是说实话还是很慌,重点就是怕规则记不清(毕竟我是网前,责任比较大)
志愿者休息室一览(其实是后面几天的图)
当然啦,晚饭还是要吃的,实话实说,我们这吃的是真的好,而且餐餐都有水果牛奶,还不带重样的
穿上新衣服的 NX
每天必做的核酸
DAY1(22日)
实话实说,在我参加这个比赛之前,没有感受过真实的比赛氛围,第一天还是非常紧张的
出发前的全身照 (别问我 ...
SQL 入门笔记(十)分组数据
本篇主要讲述如何使用 GROUP BY 和 HAVING 子句
数据分组
上一篇讲述了如何使用聚集函数汇总数据(如总数、平均值和最大最小值)
但是目前汇总的范围只能是整个表,或使用 WHERE 匹配一个指定的字段,例如下面返回由供应商 DLL01 提供的产品数目
123SELECT COUNT(*) AS num_prodsFROM ProductsWHERE vend_id = 'DLL01';
但是,如果要分门别类地返回各个供应商的产品数目呢?
这就需要对数据进行分组,然后对每组分别计算
创建分组
分组是使用 GROUP BY 子句创建的,理解分组的最好方法是看一个例子
123SELECT vend_id, COUNT(*) AS num_prodsFROM ProductsGROUP BY vend_id
由于使用了 GROUP BY ,DBMS 会自动依照 vend_id 来分组,然后对每一个组都执行一次聚集函数
下面是一些关于 GROUP BY 的重要规定
GROUP BY 可以包含任意数目的列,用来嵌套分组(用后面的字段进一步分割前面已经分好的组)
除聚集计算语句外,SELECT 中的每一列也必须出现在 GROUP BY 中
GROUP BY 中的每一列都必须是真实的列(可以不是 SELECT 中的)或有效的表达式,不能使用别名。如果在 SELECT 中使用表达式,则必须在 GROUP BY 中指定相同的表达式
大多数 DBMS 不允许在 GROUP BY 中使用可变长度数据类型的列(如文本或备注型字段)
如果包含了值为 NULL 的行, ...
『Go』有关 range 和指针接收者的坑
这其实是个老生常谈的问题了,在例会上被第二次提到,原文见此
本人简单概括一下
12345678910111213141516171819202122type Group struct { Name string Persons []Person}type Person struct { Name string //标准名 Alias []string //别名,可以是邮箱、QQ号等 Submit bool // 是否已提交}func (p Group) ChangeSomeThingV1() { for _, person := range p.Persons { person.Submit = true }}func (p *Group) ChangeSomeThingV2() { for _, person := range p.Persons { person.Submit = true }}
这两个 ChangeSomeThing() 方法的区别是什么?哪个能够起作用?
答案是:两个都没用
这是一个新手经常会犯的错误,要知道,和 Python 中一样,range 枚举出来的都是副本,修改副本是没有用的
可以这样解决
1234for i := range p.Persons { p.Persons[i].Submit = true //person.Submit = true }
当然,更好的一种方法是 ...
『Ops』运维基本技能树
这是昨晚例会上 ESON 的讲稿,然后我还康到了一本好书:https://book.hacktricks.xyz/
Ops
[TOC]
什么是运维
就是牛马, 当牛做马.
开发背锅侠, 生产事故擦屁股的
配环境的勾八
From WIki
是对技术类运营维护人员的统称。运维人员的职责是根据业务需要规划信息、网络、服务,通过网络监控、事件预警、业务调度、排障升级等手段,使服务处于 长期稳定可用状态。
基本技能树
Linux
这个还需要多说? 啥软件不是在服务器里的 Linux 的?
隔壁 Win Server 突然弹起
各种 Shell
各种命令
折腾 linux 基本上是运维入门的第一堂课
插播一条 如何 AddUser
到这个位置 基本就有一个 基础到不能再基础的 运行环境了
数据库
数据库基本逃不过 CRUD
高级点无非是 性能优化 建立索引 视图 等等
Mysql 关系型
会看 binlog 数据库数据恢复 备份 CRUD
Redis KV型
SET GET 查 烧操作很多 一般是作为后端第二个接触到的数据
MongoDB 文档型
文档 JSON 这玩意在你还不确定你的数据需要如何存储 或者设计表单的时候 非常好用
neo4j 图型
这种一般性开发是用不太到的 一般是专业需求
这里基本上你就可以调用这些存储资源 来进行最最基本的后端开发了
各类中间件
中间件是为应用提供通用服务和功能的软件。 数据管理、应用服务、消息传递、身份验证和API 管理通常都要通过中间件。 中间件可以帮助开发人员更有效地构建应用。 它就如同是应用、数据与用户之间的纽带。
...
『Windows』关于使用宽带时无法正常使用代理的问题
当你使用宽带接入校园网的时候,可能会遇到无法正常使用 ShadowsocksR 代理的问题
经过后端群内大佬的指引,发现解决方法其实很简单,就是把连接名改为非汉字就好了
但是目前 Windows11 有 UI bug,只有连上了之后才能改名
『总结』大一下期中总结
呼!终于把一堆事情给忙完了
时间真快,不知不觉这个学期就过了一半
前几天为了备考期中考,就停更了几天,昨天刚把期中考考完了,接下来会恢复日更的习惯的(堆了一堆东西没写呢!包括上周末后端例会讲的一些知识点我都没好好整理)
好了,接下来进入正题,对目前的情况做一下小结
这半个学期干了什么?
上半学期数起来还是做了不少事情的,自从2月20号开学以来,我把 gin 框架的坑差不多填完了,然后把建站指南也填完了,之后入门了 Python(整了有一半了吧),然后开了个 SQL 的坑,之后又开了个微信小程序的坑,然后做了个 ToDoList,又往里面塞了好多东西 (我怎么挖了这么多坑)
另外,我搭了一个 MC 服务器,跟几个舍友一起通关了暮色森林(遗憾的是王总没来,他去打老头环了,这东西刚发布的时候太上头)
另外,我参加了杭州亚运会的志愿者选拔,分配到的职位是网球球童,目前还没被筛掉,下周末还要去参加一个测试赛锻炼一下能力
还有参加了一个挑战杯的竞赛小组 (虽然我感觉没什么戏)
还有什么??哦,我这学期还被推举为入党积极分子 (有政治正确那味了)
然后我还报名了一个字节跳动的青训营,月底有笔试,进去应该问题不大,直播会上给我画了个大饼,感觉能学到很多东西
除了这些课余的,学业方面呢?
首先,期中考已经考完了,目前就出了个物理是 79 ,高数估计挂了,没复习好
说到物理,我真的想喷一下这个老师,讲课是真的烂,我可以直言不讳地说,我读书这么多年,他是我见过的上课讲的最烂的老师
我上课基本没认真听过,基本上就是靠考前去 B 站找视频看学一下,最后还考了个 79
相比之下,高数就讲的还行,虽然讲了很 ...
Hexo + Butterfly 建站指南(八)使用 KaTeX 数学公式
2022年6月17日更发现可以按照官方的方法弄了,之前一直无效(
插一嘴,因为 hexo-renderer-markdown-it 的 anchors-level 默认是 2 ,所以会有一级标题无法索引的情况,需要手动指定一下
12345678markdown: plugins: - plugin: name: '@neilsustc/markdown-it-katex' options: strict: false anchors: level: 1
在 Butterfly 主题里的确是有公式的设置的,在官方文档里也有教你配置的教程
但是鄙人跟着流程走下来真的一点用都没有,还是没法渲染 😭😭😭
一个不建议使用的方法
2022年4月17日深夜注:安装这个弄完后的确能正确显示公式,但点击右侧目录中的一级标题不会跳转(没有创建对应的元素),虽然我用hexo-renderer-markdown-it-plus或hexo-renderer-markdown-it的配置法在 _config.yml 中把 level 设置为了1,但好像没有什么卵用,详情请见【Hexo】关于hexo-renderer-markdown-it引起的一级目录无法跳转的错误的评论区
昨晚上网折腾了好久好久都没法解决,今早又折腾了一早上,终于成功了
(当然,如果你按照教程能成功自然更好,但是如果你也没成功的话,希望下面的经历可以帮到你)
首先解决依赖问题
1234npm un hexo-renderer-marked --saven ...
『大学物理1』期中复习
质点运动学
圆周运动
角度 - 角速度 - 角加速度:θ−ω−α\theta -\omega -\alphaθ−ω−α
切线加速度 at=αra_{t}=\alpha rat=αr(角加速度 × 半径)
法线加速度 an=ω2ra_{n}=\omega^{2}ran=ω2r(角速度的方 × 半径)
运动建模及其方程
大部分的模型方程都是基于三角形的勾股定理
牛顿定律及常见力
没什么好记的
转动惯量和力矩
转动惯量和动能的关系:Ek=12Jω2E_{k}=\dfrac{1}{2}J\omega ^{2}Ek=21Jω2
转动惯量与角动量:L=JωL=J\omegaL=Jω
转动惯量结论
质点(微元)、绕中心旋转的薄圆环:J=mR2J=mR^{2}J=mR2(各质元到轴的垂直距离都相同)
绕中心旋转的圆盘(柱):J=12mR2J=\dfrac{1}{2}mR^{2}J=21mR2
棒子绕一端转:J=13mL2J=\dfrac{1}{3}mL^{2}J=31mL2
棒子绕中心:J=112mL2J=\dfrac{1}{12}mL^{2}J=121mL2
转动惯量计算(微元法)
例1:设转轴在棒的一端且与棒垂直,棒长为 LLL ,求转动惯量 JJJ
解:在棒上离轴 xxx 处,取长度元 dxdxdx,单位长度质量为 λ\lambdaλ,则
dJ=dm⋅x2=x2λdxdJ=dm\cdot x^{2}=x^{2}\lambda dxdJ=dm⋅x2=x2λdx
J=∫0Lλx2dx=λL33=13mL2J=\int _{0}^{L}\lambda ...