├── README.md ├── common ├── README.md ├── network.md ├── networkKnowledge.md └── oop │ ├── README.md │ ├── oop_design_pattern.md │ ├── oop_in_go.md │ ├── oop_standard.md │ └── oop_started.md ├── git ├── README.md ├── git.md └── github.md ├── golang ├── README.md ├── basicGrammer.md ├── feature.md ├── framework.md ├── package.md └── quickStart.md ├── jetBrains ├── README.md ├── commonware.md └── edu.md ├── unix ├── Brew.md ├── Golang.md ├── Protobuf.md ├── README.md ├── macOS.md ├── quickStart.md └── shell.md └── windows └── README.md /README.md: -------------------------------------------------------------------------------- 1 | # backend_guide 2 | 3 | ## 一些普适性的建议和内容 4 | 5 | * 使用Unix操作系统来完成环境和开发 6 | * 使用Goland作为Golang语言IDE,使用vscode完成文本编辑等操作 7 | 8 | ## 快速导航 9 | 10 | * [WSL Windows Linux 子系统](./windows/README.md)(Windows 用户 强烈建议) 11 | * [Brew Unix 包管理工具](./unix/Brew.md)(可选) 12 | * [Git 版本控制工具](./git/git.md) 13 | * [Goland 最好的Golang IDE](./jetBrains/commonware.md) 14 | * [Shell 使用基本逻辑](./unix/shell.md) 15 | 16 | 17 | # 综合目录 18 | 19 | ### [git 与版本控制](./git) 20 | 21 | ### [Go 语言相关](./golang) 22 | 23 | ### [jetBrains ](./jetBrains) 24 | 25 | ### [unix 下开发与环境配置](./unix) 26 | 27 | ### [win 下开发与环境配置](./windows) 28 | 29 | ### [公共 杂项](./common) 30 | 31 | ### [面向对象](./common/oop) 32 | 33 | 34 | -------------------------------------------------------------------------------- /common/README.md: -------------------------------------------------------------------------------- 1 | # 通用知识 2 | 3 | ### [./](./) 4 | 5 | ### [../](../) 6 | 7 | ### [网络代理](./network.md) 8 | 9 | ### [WEB 开发中的前后端分离](./networkKnowledge.md) 10 | 11 | ### [面向对象开发思想](./oop) 12 | -------------------------------------------------------------------------------- /common/network.md: -------------------------------------------------------------------------------- 1 | # 网络优化与代理 2 | 3 | 由于中国大陆互联网网络情况不佳,访问境外网络受阻,我们通常会使用代理加速或者镜像访问开发者内容 4 | 5 | 以下内容需要或者在网络优化后有更好的访问体验 6 | 7 | * [GitHub](https://github.com) 世界最大的开源版本控制平台 8 | * [Golang 官网](https://golang.org) 9 | * [pkg.go.dev](https://pkg.go.dev) Go 包文档中心 10 | 11 | ## 镜像 12 | 13 | * [Golang mirror](https://mirrors.ustc.edu.cn/golang/) 14 | * [GoProxy](https://goproxy.cn) 15 | 16 | ## 代理 17 | 18 | ### 配置代理 19 | 20 | [WSL](./../windows/README.md#wsl-内部-proxy-环境脚本) 21 | -------------------------------------------------------------------------------- /common/networkKnowledge.md: -------------------------------------------------------------------------------- 1 | # 前后端分离网络知识 2 | 3 | ## 概念与历史 4 | 5 | 这是 `Web` 项目开发中必需的一种思想。 6 | 7 | 下面是一些网络上的文章 8 | 9 | https://cloud.tencent.com/developer/article/1520380 10 | 11 | https://www.infoq.cn/article/mnftt4ubk5pql3jpnt6m 12 | 13 | 我对前后端分离的理解就是页面和接口的分离。在以前 `asp` `jsp` 等不分离的状态下,后端一人扛起页面渲染和数据库交互等责任,前端和后端的耦合度极高,导致开发效率低下。 14 | 15 | 后来随着 `ajax` 等技术的出现,前端请求接口越来越方便,为了解耦前端和后端,发展到了后端提供接口,前端渲染页面,也就是前后端分离。 16 | 17 | 比如 `golang` 的 `HTML` 模板渲染就是一种前后端**不**分离的形式,渲染页面时直接输出 `HTML` 代码而不是通过接口去解耦。 18 | 19 | **前后端分离不是一门技术,而是工程领域中的一个经验和实践**,随着前后端各自的技术发展,这个趋势是自然形成的。 20 | 21 | 虽然前后端分离有一定的缺点,但是依旧利大于弊,这种思想应当在实践中贯彻和理解。 22 | 23 | ## 优点 24 | 25 | 1. **节省流量。** 26 | 27 | 分离时服务端和客户端只传输数据,不分离时传输整个 `HTML` 。 28 | 29 | 2. **解耦公司内的前后端职位,提高开发效率。** 30 | 31 | 不再是前后端岗位揉成一团,而是以接口为桥梁各司其职。 32 | 33 | 3. **局部性能提升。** 34 | 35 | 通过前端路由的配置,我们可以实现页面的按需加载,无需一开始加载首页便加载网站的所有的资源,服务器也不再需要解析前端页面,在页面交互及用户体验上有所提升。 36 | 37 | 4. **部署体验提高。** 38 | 39 | 前端的代码有问题只需要改动前端再上线,后端有问题只需改动后端,不会一个小改动导致整个项目重新上线。 40 | 41 | ## 缺点 42 | 43 | 1. **前端的代码量增大,招聘门槛变高。** 44 | 45 | 但对于前端和后端却是好事,一方面前端从以往后端的“附属品”逐渐拥有话语权,另一方面前端的门槛提高有助于降低后端的心智负担,不至于对接的前端都是阿猫阿狗。 46 | 47 | 2. **网站SEO效果变差。** 48 | 49 | 前端 `DOM` 动态渲染导致对搜索引擎的友好度降低,不过这可以通过 `SSR` 解决。 50 | 51 | 3. **文档重要性提升。** 52 | 53 | 因为要按照接口去编写代码,前后端对接的接口文档显得十分重要,所以项目最好的方式是前后端先共同商议文档,而后再各自编写代码。但是由于大部分人并不喜欢写文档,所以对接有时显得混乱。 54 | 55 | ## 前后端交互 56 | 57 | ### 协议 58 | 59 | `Web` 项目大部分使用 `HTTP` 协议,毕竟是跑在浏览器上的,`HTTP` 支持最好 60 | 61 | 像 `APP` 或 桌面应用也可以采用 `RPC` 协议远程调用,`RPC` 相对 `HTTP` 的开销更小 62 | 63 | 协议不是交互的重点,主要根据项目的设计和框架走 64 | 65 | ### 序列化格式 66 | 67 | 序列化通俗的讲就是把代码中复杂或者简单的结构体转化为可传输的二进制或文本 68 | 69 | 反序列化即把可传输的二进制和文本变为代码中的结构体 70 | 71 | 常见序列化如下,这些格式在:(助手项目中大多采用 `JSON` 和 `Protobuf`) 72 | 73 | - `JSON` [教程](https://www.runoob.com/json/json-tutorial.html) 74 | 75 | 常用于前后端数据传输,体积小、可读性好。由于大部分情况下不支持注释,很少用做配置文件。 76 | 77 | - `YAML` [教程](https://www.runoob.com/w3cnote/yaml-intro.html) 78 | 79 | 常用于程序的配置文件,支持注释,可读性好。但是语法的缩进敏感对新手不太友好,经常写出错误语法。 80 | 81 | - `TOML` [教程](https://helbing.github.io/blog/posts/toml-tutorial/) 82 | 83 | `Github` 创始人与前 `CEO` 提出的格式,比较新的一种格式。通常用作程序的配置文件,对新手比较友好,但是写多层嵌套的时候可读性会变得很差。 84 | 85 | - `Protobuf` [教程](https://colobu.com/2019/10/03/protobuf-ultimate-tutorial-in-go) 86 | 87 | 需要使用 `.proto` 文件定义结构。速度快体积小,但是因为用二进制表示,可读性较差,常用于微服务中 `RPC`调用,有时也用于 `Web` 传输。当然目前 `Protobuf` 的应用范畴已经不局限于序列化了,也用于微服务的 `service` 定义等等。 88 | 89 | - `Msgpack` [教程](https://www.liwenzhou.com/posts/Go/gob_msgpack/) 90 | 91 | 类似 `Protobuf` ,但是因为没有一个好爹所以干不过 `Protobuf` 92 | 93 | - ...... 94 | 95 | ### 等待补充 96 | 97 | ## 其他 98 | 99 | > 不要有一把锤子,看什么都是钉子 100 | 101 | 在Web项目开发前应当预估项目规模、技术栈等等需求再去决定开发模式,而不是无脑前后端分离。 102 | 在一些开发时间紧的项目里,`PHP` (不分离)显然是比 `Golang` (分离) 更好的选择。 103 | 当然,在时间允许的情况下,尽量采取前后端分离的开发模式,这在后续团队规模扩大、项目复杂度变高后会体现出非常大的优势。 104 | 105 | > 这里可以安利一下 Cloudflare 的 pages 作为前端的部署, 也可以当作博客的网页做自动部署 他自己会有前端项目的 CI/CD 106 | > 107 | > 支持 Vue React 乃至是 hexo 和 hugo 的部署 108 | > 109 | > cloudflare 的产品非常适合托管你的域名帮助你更好更快的完成你的全栈级开发 -------------------------------------------------------------------------------- /common/oop/README.md: -------------------------------------------------------------------------------- 1 | ## 面向对象思想 2 | 3 | 可以说,每个写业务的程序员都需要掌握面向对象思想。这里给出一些面向对象思想的指引。 4 | 5 | ## [1. 面向对象思想入门](./oop_started.md) 6 | ## [2. 面向对象标准实现](./oop_standard.md) 7 | ## [3. Go 如何实现面向对象](./oop_in_go.md) 8 | ## [4. 常用面向对象设计模式](./oop_design_pattern.md) 9 | 10 | oop 并不是灵丹妙药(silver bullet),在合适的时候使用它就好。 11 | 12 | 我也曾在某个地方看到,说,封装、继承、多态很早就被提出了,并不是面向对象独有的。 13 | 函数式编程等思想,都可以一试,适合的就是最好的。不要过度迷恋一种思想。 14 | -------------------------------------------------------------------------------- /common/oop/oop_design_pattern.md: -------------------------------------------------------------------------------- 1 | # 面向对象设计模式 -------------------------------------------------------------------------------- /common/oop/oop_in_go.md: -------------------------------------------------------------------------------- 1 | # 谈谈Go与面向对象 2 | 3 | 本文面向已经会 Go 的基础语法并基本掌握一门面向对象语言的读者。 4 | 5 | 先抛个问题:Go 是不是面向对象语言? 6 | 7 | 官方的回答是:「Yes and no」。 8 | 9 | Go 语言可以做到绝大多数面向对象语言的特性,但它不是一门「标准」的面向对象语言,它没有「type hierarchy」。 10 | 11 | 一开始,我觉得它以自己的奇怪甚至近乎「妖魔」的方式与面向对象打了个擦边球; 12 | 后来,我反而觉得完美面向对象就应该是这样灵活的,现在的所谓的「标准面向对象」,反而是一种不完美的实现。 13 | 14 | 下面来谈谈 Go 如何实现面向对象。因为 Java 是比较「规整」的面向对象实现,所以下文会多次与 Java 进行对比。 15 | 16 | ## 封装 17 | 18 | 封装指隐藏对象的属性和实现细节,仅对外提供公共访问方式。 19 | 20 | 这个应该不用多讲,Go 使用大小写控制可访问性(包外),大写代表导出(public),小写代表私有(private)。 21 | 22 | 方法暴露,使用 `receiver` ,类型、变量、方法的可见性规则都是用大小写。 23 | 24 | ```go 25 | type Person struct { 26 | Name string // 大写,导出,包外可见,public 27 | age int // 小写,私有,仅包内可见,private 28 | } 29 | 30 | // Speak 暴露公有方法 31 | func (p *Person) Speak() { 32 | fmt.Println("Hello, my name is", p.Name) 33 | } 34 | 35 | // SetAge GetAge 方法略 36 | ``` 37 | 38 | 为类增加方法,Go 与 Java 最大的不同是,Java 的方法是在类内的,而 Go 在类外,有点像 struct 上贴了一个个狗皮膏药的感觉。 39 | 起初可能会不习惯,但这让方法的添加变得更灵活,receiver 的设计更使得所有类都能拥有方法。 40 | 41 | Go 的 receiver 的设计更符合底层的面向对象的思想:为某一类事物,附加一些行为。 42 | 43 | Go 的任何非内置的「定义类型」,都能拥有方法;而 Java,只有类才能拥有方法,或者说,想在一个东西上施加操作,必须定义一个类,显得臃肿。 44 | 45 | ## 继承 46 | 47 | 我对继承的理解是,子类拥有父类的所有属性和方法。 48 | 49 | Go 的继承使用类似组合的方式实现,与标准面向对象实现最大的区别在于,基类变量不能引用子类变量。 50 | 51 | ```go 52 | type Man struct { 53 | Person // 内嵌,继承 54 | otherField string // 组合 55 | } 56 | 57 | man := Man{"bird"} 58 | _ = man.Person.Name 59 | _ = man.Name // 省略 Person 匿名字段 60 | man.Speak() 61 | ``` 62 | 63 | 如上,在 Man 中加入一个只有类型没有名字的 Person 属性,就是内嵌。Go 的一大特性就是,内嵌字段可以被省略。详见代码。 64 | 65 | 所以,Man 可以省略 Person,**直接访问 Person 的所有属性并调用其方法**。所以看起来,就像继承一样。 66 | 67 | 总结一下就是,结构体内嵌匿名变量就是继承,无名就是组合。 68 | 69 | 和 Java 的区别在于, `var p person = Man{}` 是不可行的。父类变量无法引用子类对象(但这并不意味着 Go 没有多态)。 70 | 所以 Go 的继承是不满足「里氏替换」原则的。 71 | 72 | 我觉得这个特性挺好,逼迫开发者少使用继承,多面向抽象编程。 73 | 74 | 如何实现对方法的重写(Override),即子类覆盖父类的同签名方法,以实现不同表现? 75 | 76 | 稍微岔开一下,Go 没有「重载」,即同函数名,函数签名却不同。所以这个问题其实是,Go 如何覆盖父类同名方法? 77 | 78 | 这时候就体现 Go 的设计哲学了, less is more。你都不需要知道什么是重写: 79 | 80 | 没有那么多的术语和要记的东西,也不需要新的关键字,一切都是自然而然: 81 | 子类想用父类的,直接继承了不用管;子类想拥有不同的表现形式(行为),那就自己定义一个。 82 | 83 | 怎么自己定义一个方法呢,很简单,定义一个以子类作为 receiver 的方法。正如前面的继承,没有新增任何关键字。 84 | 85 | 简单理一下逻辑,如果调用方法的时候,子类本身拥有该方法,那就直接调用;如果没有,就看看父类有没有,一层层找上去。 86 | 87 | 如何实现多继承?想继承谁,内嵌什么类型就行。 88 | 89 | 至此,Go 非常优雅且简单地实现了继承。 90 | 91 | 这里还有个面向对象的原则,「使用组合而不是继承」,通俗继承的坏处很多,比如父类改了子类就会被动跟着改动。 92 | 所以 Go 使用了组合的方式来实现了继承,是不是天生规避了一些继承的缺点? 93 | 以及继承会暴露父类的实现细节,这个问题 Go 也存在。 94 | 95 | ## 多态 96 | 97 | Go 的多态是用 interface 实现的, interface 是 Go 语言的灵魂之一,为静态的 Go 语言增添了动态性。 98 | 99 | 我理解的接口,是一种「约定」,接口的方法,约定了一系列操作,某样东西能完成这个操作,它就实现了这个接口。 100 | 101 | 下面这段代码演示了许多面向对象的内容,其中,末尾的 `AllSpeak` 函数是多态的展示。 102 | 103 | ```go 104 | type Speaker interface { 105 | Speak() 106 | } 107 | type Person struct { 108 | Name string 109 | } 110 | func (p Person) Speak() { 111 | fmt.Println("Hello, my name is", p.Name) 112 | } 113 | type Dog struct { 114 | Name string 115 | } 116 | 117 | type SingleDog struct { 118 | Dog 119 | } 120 | 121 | func (d Dog) Speak() { 122 | fmt.Println("Wang Wang, my name is", d.Name) 123 | } 124 | func TestInf(t *testing.T) { 125 | 126 | var s Speaker 127 | p := Person{"Tom"} 128 | s = p // 接口变量能指向实现了该接口的对象 129 | s.Speak() 130 | 131 | person := Person{"Tom"} 132 | dog := Dog{"Jerry"} 133 | singleDog := SingleDog{Dog{Name: "SingleDog"}} 134 | speakers := []Speaker{person, dog, singleDog} 135 | AllSpeak(speakers) 136 | } 137 | 138 | // AllSpeak 多态演示 139 | func AllSpeak(s []Speaker) { 140 | for _, v := range s { 141 | v.Speak() 142 | } 143 | ``` 144 | 145 | Go 语言的接口是非常灵活的,不需要显示声明,Java 需要 `implements`,而 Go 是 DuckType。 146 | 147 | 什么是 DuckType?鸭子会嘎嘎叫,所以会嘎嘎叫的就能当成鸭子。 148 | 149 | 翻译成编程语言,接口是一个约定,遵循了这个约定,就实现了接口。这个遵循,只要某个类型的方法签名是某接口定义的方法签名的超集就行。 150 | 151 | 所以,一定记住,在编码层面,方法先于接口,即先有了方法,才有了是否实现该接口的判断。而不是 Java 的先明确实现什么接口,挖好坑,再去填。完全相反。 152 | 153 | 如果实现多态?接口类型的变量,可以引用实现了该接口的任何类型的变量。 154 | 155 | 在 `AllSpeak` 函数中,形参是 `Speaker` 接口的切片,实参却是 Person、Dog、SingleDog 类型。 156 | 为什么能调用成功呢?因为 `Person` 和 `Dog` 都拥有 `Speak()` 方法,满足了 `Speaker` 接口定义的所有函数的签名。 157 | 158 | 那为什么 SingleDog 类型也能传参成功,是不是可以理解为,SingleDog 继承了 Dog 的接口?似乎变得复杂起来了。 159 | 160 | Go 没有那么多术语。紧抓两点:①编码时,先看方法,再看接口 ②某类型拥有的方法是某接口方法的超集,就实现了该接口 161 | 162 | 所以,是 SingleDog 先「继承」了Dog的 `Speak()` 方法,而后该方法刚好又满足了 `Speaker()` 的约定,自然就实现了该接口。 163 | 164 | 许多语言的接口与继承,对于开发者而言其实是迷惑的,可能经常分不清到底该用哪个,而 Go 不会。 165 | 许多面向对象语言的继承,是被滥用的,而 Go,压根没开这个门,你只能用接口。 166 | 它以一种非常灵活的方式,实现了多态,并且接口的设计,对「依赖反转(面向抽象编程)」天然友好。 167 | 168 | interface 真的是个好东西,当你不知道怎么设计更优雅的时候,它总能给你带来惊喜。 169 | 170 | 171 | -------------------------------------------------------------------------------- /common/oop/oop_standard.md: -------------------------------------------------------------------------------- 1 | ## 面向对象标准实现 2 | 3 | 这里应该是一个标准的面向对象实现教程,如以 Java 为例。 4 | 5 | 这是一个漫长的过程,网上的资料也非常多,更推荐阅读广泛的资料、线下教学、切身实践来体会。 6 | 7 | 所以这里只贴些优质资源。 -------------------------------------------------------------------------------- /common/oop/oop_started.md: -------------------------------------------------------------------------------- 1 | # 面向对象思想入门 2 | ## 一、形象解释什么是面向对象 3 | ### 1.1 小例子 4 | 先来个例子,简单了解一下面向过程和面向对象的区别。 5 | 6 | > 有一天你想吃鱼香肉丝了,怎么办呢?你有两个选择: 7 | 1、自己买材料,肉,鱼香肉丝调料,蒜苔,胡萝卜等等然后切菜切肉,开炒,盛到盘子里。 8 | 2、去饭店,张开嘴:老板!来一份鱼香肉丝! 9 | > 看出来区别了吗?1是面向过程,2是面向对象。 10 | 11 | *文章来源:[什么是面向对象(OOP) - 简书](https://www.jianshu.com/p/7a5b0043b035)* 12 | 13 | *本文也就这段话是复制的了,本来想做个资源帖的收集,写着写着发现,还是自己写的东西有趣,干脆就不参考了。 14 | 至于那些非常专业的文章,大家在看了我的文章后,建立了对面向对象思想的理解,也就看得懂其他文章了,自行查阅就好。* 15 | 16 | 狭义地理解,面向过程就是,**以过程为中心**,就像做数学题那样,定义了解题的一个个步骤。 17 | 面向对象就是,抽象出一个个的模型,已经预定义了这个类型有哪些属性,能做些什么,直接调用就好。 18 | ### 1.2 面向对象再解释 19 | 20 | 上面我们通过一个例子感性得理解了面向对象的整体,下面我们继续举例,带大家理解面向对象的细节。 21 | 22 | 直接来个实际的例子,例如,我们要实现一个查询学生电话号码的接口。 23 | 24 | **面向过程的实现方法:** 25 | 写个 `getStudentInfo` 函数,形参是学生的唯一标识符(如学号)。 26 | 先不考虑数据库,那么我们需要维护一个学生信息的数组,然后一个个比对。 27 | 28 | 如果我们又要实现,查询学生寝室号、辅导员,又要再写两个函数吗?而且这些函数的形参,全是学生ID。 29 | 30 | 有没有更好的解决方案呢? 31 | 32 | 这时候你可能会质疑,我学过 C 啊,你讲的这玩意,压根不用定义函数啊? 33 | 34 | 我直接进行一个结构体的定义,一个 `Student` 结构体,然后把学号、姓名、电话、辅导员信息都塞里面, 35 | 想查询信息的时候,只要用 `student.name` 就能获取到姓名了。 36 | 37 | 其实,这便是一种非常简单的面向对象的思想。前面讲过,面向对象,在我的理解中,最浅层的, 38 | 就是把一些属性和能做什么聚在一起,形成一个类。而 C语言 的结构体,就是做到了属性的聚合。 39 | 40 | 继续给需求,如果主人又来任务了,这时候给了个,「上课签到记录」的接口,怎么办? 41 | 结构体成员变量实现这个功能吧? 42 | 43 | 一个声音浮现在脑海:用函数啊!直接定义一个签到函数! 44 | 45 | 可是函数,它就,不优雅了啊,它是面向过程! 46 | 47 | 那么,我们既然已经把属性塞到结构体里面了,采用 `变量.属性名` 的方式获取。 48 | 我们可不可以,把函数也塞到结构体里面呢?采用 `变量.函数名` 的方式获取? 49 | 50 | 大聪明鬼,这就是 Go 语言面向对象的简单实现了!!! 51 | 52 | 把属性和行为塞(封装)到结构体里面之后,和之前的面向过程有什么不一样? 53 | 54 | 之前的函数调用,学生属于形参,是传进去的。 `getInfo(user)` , 55 | 而现在,学生是调用方,是主体, `user.GetInfo()`。 56 | 57 | 换句话说,之前的函数调用, 操作的是外部的数据信息。而现在,变量(属性)操作(方法) 58 | 成为了类型的一部分,是固有的。一旦这个类型建立了,那它对应的变量什么的,也都直接附带上了。 59 | 同时,利用对象调用方法,更像是一种「操作」,什么叫操作?就是,我这个对象,里面有些数据, 60 | 通过调用某个方法,修改了对象内的一些信息,「操作」了一下。就这么先这么狭义理解。 61 | 62 | 63 | 有个小细节需要注意,当函数和对象结合的时候,它就不叫函数了,叫「方法」。任何语言都是如此。 64 | 65 | 不同语言面向对象的实现方法都不一样,大部分面向对象的语言,都是用 `class` 关键字实现的, 66 | Go 语言的实现比较奇葩,是用 `Struct` 和 `receiver` 来结合实现的,它不是纯粹的面向对象语言。 67 | 68 | 所以在初学面向对象思想的时候,不建议一开始就拿 Go 语言学习面向对象,容易走火入魔。 69 | 比较建议看看 `C++` 或 `Java` 的面向对象的实现。不过话说回来,虽然 Go 的面向对象实现有点显得歪门邪道, 70 | 但是,当它和 Go 的接口结合起来的时候,一切就都会变得非常有趣。 71 | 我更愿意称 Go 语言的面向对象是灵活的面向对象。 72 | 73 | ## 面向对象概念解释 74 | 首先是 `类` 的概念。类,你可以理解为,类型的意思。 75 | 或者说,他们是同一类的,他们有相似的行为(函数),相似的特征(属性),那他们就是一类。 76 | 比如,人类,动物类,学生类。 77 | 78 | 然后是 `对象` 的概念,这个对象不是那种,冬天了可以抱抱的对象。是 `类` 的 `实例`。 79 | 类,概括出了同一种类型的事物,对象,就是这一类事物中,具体的某个个体。 80 | 比如,`人类` 是个 `类`,张三就是个对象,或者说 `实例`。利用类建立对象的过程,就叫 `实例化`。 81 | 82 | 然后是 `继承`。我不说啥意思,就举例子,你自己体会。哺乳动物类继承动物类,人类继承哺乳动物类, 83 | 男人类继承人类,爸爸类继承男人类。 84 | 85 | A类 `继承` B类,表明,A类拥有B类的所有属性(特征)和方法(行为、能做的事)。并且自己可以加些新的属性和方法。 86 | 比如,女人类拥有人类的一切属性,又能做任何人能做的事,她又可以有些特殊的属性或方法。 87 | 而程序员类不是继承了男人类或女人类的。被继承的类叫 `父类`,另外一个叫 `子类`。 88 | 89 | 再解释一下什么叫 `封装`。先贴个专业解释: 90 | > 通过对象隐藏程序的具体实现细节,将数据与操作包装在一起, 91 | > 对象与对象之间通过消息传递机制实现互相通信(方法调用), 92 | > 具体的表现就是通过提供访问接口实现消息的传入传出。 93 | 94 | 麻了吧? 95 | 96 | 其实前面讲的那些,把属性和方法放在一起,就是封装的一部分。也就是被引用的内容中提到的 97 | 「将数据和操作包装在一起」。数据就是属性,操作就是方法、行为。 98 | 99 | 什么叫隐藏实现细节呢?简单说两点: 100 | 101 | 第一,C语言的结构体,任何类型都是可以直接访问的, 102 | 我想让外部调用者没法直接访问某些数据怎么办?用类可以实现。 103 | 第二,别人写好的东西,我才不管你具体怎么实现的,我只要知道怎么用就行。 104 | 甚至,我只要知道哪个方法能查成绩就行,我就这么写了, 105 | 如果你想修改查成绩的内部实现,和我无关,因为接口已经定死了。 106 | 107 | 其实这个和函数封装差不多。 108 | 109 | 最后解释一下,`多态`。 110 | 111 | 还是举例子吧,前面讲到,我想查询学生的基本信息,写了个方法。 112 | 113 | 现在,我又想查询老师的基本信息了,再写个方法? 114 | 115 | 那这样的话,要针对不同的类型写不同的方法,但他们实际执行的操作差不多啊? 116 | 而且,我如果想用一个函数就能查询老师或学生的信息,要写一堆 `if` 吗? 117 | 118 | 能优雅一点吗? 119 | 120 | 面向对象,类似的属性和操作,都能封装。他们都叫「查询某个人的基本信息」。 121 | 122 | 其实,我们可以定义一个「学校师生」父类,「学生类」和「教职工」类分别继承它。 123 | 「学校师生」类可以定义一个「查询信息」方法,然后另外两个类 `重写` 这个方法。 124 | 即,父类有个 `getInfo()` 的方法,两个子类也各有一个 `getInfo()` 的同名方法。 125 | 126 | 这么做有什么好处?怎么还不讲多态??? 127 | 128 | 多态有很多种,这里讲一种。比如,你可以定义一个基类的变量(指针),它是可以引用(指向) 129 | 所有父类的。换句话说,你可以定义一个「学校师生」类的变量, 130 | 然后查询信息的时候,直接调用 `父类.getInfo()` 131 | 无论你是通过「学生类」还是「教职工」类的对象调用的这个方法, 132 | 编译器都能找到对应的方法,即,它知道该调用哪个查询信息的方法,即, 133 | 如果是学生调用这个方法,就查询学生信息,如果是老师就查询老师信息。非常的阳间。 134 | 135 | 未完待续。。。 136 | -------------------------------------------------------------------------------- /git/README.md: -------------------------------------------------------------------------------- 1 | # 版本控制 Git 2 | 3 | ### [./](./) 4 | 5 | ### [../](../) 6 | 7 | ### [git 基础入门](./git.md) 8 | 9 | ### [github 基本与进阶](./github.md) 10 | -------------------------------------------------------------------------------- /git/git.md: -------------------------------------------------------------------------------- 1 | # Git 教程 2 | 3 | ## 导入 4 | 5 | Git 是一个分布式版本控制软件 最初由林纳斯·托瓦兹创作 于2005年以GPL发布 最初目的是为更好地管理Linux内核开发而设计 6 | 7 | git 会记录其文件变化 对代码进行跟踪和定位 其最大的优势是 **合并跟踪** 这对于大型项目合作开发非常有用 8 | 9 | 同时 git 的操作更加类似与 文件系统 尽管其具体原理有些晦涩难懂 但是基本的操作又都是~~非常友好~~的 指令 10 | 11 | git 的内部实现方式类似与 拷贝文件 但却是进行特殊二进制格式的对象存储 以及压缩 其具体实施过程会由 git 自动负责, 作为程序员本身不需要过多的操心。所以往往其整个 git 项目的文件夹的大小大约等于两倍的源码文件的大小 12 | 13 | ## 基础指令 14 | 15 | ### git clone 16 | 17 | 这个指令就可以用四个大字概括 **拿来吧你** 18 | 19 | 一般可以有 三种下载方案 20 | 21 | HTTPS / SSH / 类 Git App 22 | 23 | > 注意 ssh 处可能需要配置对应的账户 SSH 公私钥 24 | > 25 | > 具体操作可以在 [官方文档](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account) 找到 26 | > 目前 ssh 是使用较多的操作 27 | 28 | ### git add 29 | 30 | 当代码编辑完毕之后使用 31 | 32 | 增加指令 可以将代码增添到 **临时的存储区域** 并且对存储对象进行预备操作 33 | 34 | > 一般在 jetbrains 系列内置的 git 中 只是勾选文件就可以进行简单的 add 操作 35 | 36 | cli 下指令如下 37 | 38 | . 是指 当前文件夹 git 会递归当前文件夹下的源代码文件 并且对变化的源代码文件进行增加 39 | 40 | -v 只是增加了 verbose 以观察具体的 文件增加过程 以防错误地将敏感文件增加进入 git 历史之中 41 | 42 | > 例如 您的 password, 小程序的 key 等等 43 | 44 | ``` bash 45 | git add [-v] . 46 | ``` 47 | 48 | 也可以替换为 其他的具体文件名称 例如 git.md 49 | 50 | ``` bash 51 | git add git.md 52 | ``` 53 | 54 | 帮助 以及 更多 add 的特殊操作 55 | 56 | ``` bash 57 | git add -h 58 | ``` 59 | 60 | 在 add 进行完毕后 我们可以通过指令 来输出具体的添加和临时存储的信息 61 | 62 | ``` bash 63 | git status 64 | ``` 65 | 66 | ### git commit 67 | 68 | commit 便是进行提交和本地归档的操作 所以 commit 操作较为核心 69 | 70 | 其同时也具有更多的 子选项和子指令 71 | 72 | git 会对 add 操作之后的 **临时存储区域** 进行存储操作 将指定的变动文件进行 73 | 74 | 现在是基础款的 信息添加 75 | ``` bash 76 | git commit -m "提交消息1" 77 | ``` 78 | 79 | 帮助 以及 更多 commit 的特殊操作 80 | 81 | ``` bash 82 | git commit -h 83 | ``` 84 | 85 | 这里的操作更多更为复杂 暂时不宜进行展开 可以在遇到了具体问题之后 进行搜索 86 | 87 | > 同时 由于本组织使用 jetbrains 系列作为基础的开发 88 | > 89 | > jetbrains IDE 掩盖了大多数的指令操作 具有的 git 模块会较为具体的展现出各个选项 对新人非常友好 90 | 91 | ### git push 92 | 93 | push 指令是作为 上传指令出现的 94 | 95 | 其原理是将本地的 .git 文件夹重命名后 上传至服务器中 96 | 97 | 一般是 项目名称.git 98 | 99 | ``` bash 100 | git push 101 | ``` 102 | 103 | 一旦你开了一个 pr 之后 再进行编辑时非常容易 push 失败 104 | 105 | 这时我们需要使用 来进行强制上传提交 106 | ``` bash 107 | git push --force 108 | ``` 109 | 110 | 帮助 以及更多 push 操作 111 | 112 | ``` bash 113 | git push -h 114 | ``` 115 | 116 | ## Commit & Branch 基础使用的小游戏 117 | 118 | https://learngitbranching.js.org/?locale=zh_CN (这是中文版的) 119 | 120 | 上述教学网站可以提供输入 shell 指令的空间 通过简单的交互和小任务(游戏)的形式使得使用者快速入门 git 命令行操作 121 | 122 | ### 关于 branch fork 与 commit 123 | 124 | - commit 基础款的提交操作 可以用来进行详细的说明与操作 125 | - branch 更像一个对 commit 的引用操作 126 | - fork 几乎可以是完全分离 有一些分家的意味 但也可以用来 提 pull Request 为项目提交改变 127 | 128 | ======= 129 | ## Commit & Branch 等基础使用 130 | 131 | https://learngitbranching.js.org/?locale=zh_CN (这是中文版的) 132 | 133 | 上述教学网站可以提供输入 shell 指令的空间,通过简单的交互和小任务(游戏)的形式使得使用者快速入门 git 命令行操作. 134 | 135 | ## 客户端选择 136 | 137 | - 普普通通 cli git 138 | - 可视化的 fork (https://git-fork.com/) on windows mac 139 | - ... and so on 140 | 141 | ## Goland Git 142 | 143 | https://www.jetbrains.com/help/go/using-git-integration.html 144 | 145 | goland jetbrains 官方对于 内置 Git 功能的说明与使用 146 | 147 | 148 | ## Unimportant Misc 149 | 150 | ### git commit 规范问题 151 | 152 | AngularJS 的 git 规范 是使用较为广泛的规范 153 | 154 | 具体的规范需要遵从具体的项目下说明文档 155 | 156 | 文章: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#heading=h.uyo6cb12dt6w 157 | 158 | 159 | 160 | 161 | -------------------------------------------------------------------------------- /git/github.md: -------------------------------------------------------------------------------- 1 | # Github 教程 2 | 3 | ## 官方 Lab 4 | 5 | https://lab.github.com/ 6 | 7 | 官方 lab 是基础的引入 其中涵盖了大大小小的模块课程 8 | 9 | 包括 : 10 | - github 的介绍 11 | - github action 的基础介绍 12 | - github pages 的 blog 搭建 13 | - ... 14 | 15 | ## 教育优惠 16 | 17 | http://education.github.com/ 18 | 19 | requirements: edu 邮箱 [, 学生个人信息或学信网] 20 | 21 | 首页上可以进行 Github Student Pack 跟随指示 进行一步步操作 22 | 23 | 目前 本校邮箱可以免验证学信网帐号以及学籍信息 24 | 25 | 可提供的优惠包括但不限于 jetbrains 学生优惠, Github Pro 帐号, ssh 终端管理器 Termius 26 | 27 | 28 | -------------------------------------------------------------------------------- /golang/README.md: -------------------------------------------------------------------------------- 1 | # Golang 开发基本功 2 | 3 | ### [./](./) 4 | 5 | ### [../](../) 6 | 7 | ### [go 基础语法](./basicGrammar.md) 8 | 9 | ### [go 特性自查表](./feature.md) 10 | 11 | ### [go 基本框架介绍](./framework.md) 12 | 13 | ### [go 包管理历史与使用](./package.md) 14 | 15 | ### [go 后端速成](./quickstart.md) 16 | 17 | -------------------------------------------------------------------------------- /golang/basicGrammer.md: -------------------------------------------------------------------------------- 1 | # Golang 基础语法 2 | 3 | ## 资料推荐 4 | 5 | * [Go语言圣经](https://books.studygolang.com/gopl-zh/):《The Go Programming Language》 中文版本,慢慢看 6 | -------------------------------------------------------------------------------- /golang/feature.md: -------------------------------------------------------------------------------- 1 | # Go 特性自查 2 | 3 | **没标「略难」的,都建议搞懂** 4 | 5 | ## 一、判断题(做) 6 | 1. 函数和方法没区别,只是同一个东西的不同叫法 7 | 2. Go 需要显式实现接口所有方法才算实现该接口 8 | 3. 基础类型(数值、字符串、bool)可以作为接收者 9 | 4. (略难)指针变量一定能调用 receiver 为非指针的方法 10 | 5. (略难)非指针变量一定不能调用 receiver 为指针的方法 11 | 12 | 13 | ## 二、简答题(做) 14 | 1. 如何用 Go 实现多态 15 | 2. Go 语言的 error 类型是如何实现的 16 | 3. 重载、重写、(接口)实现都是什么意思,Go 有这些吗?能给出代码例子吗? 17 | 4. 如何用 Go 实现继承 18 | 19 | 20 | ## 三、代码实例(看) 21 | ### 3.1 用 Go 实现人民币类型 22 | 分别用结构体和 `type` 实现,更推荐结构体(但建议两种实现方式都看一下),理由如下: 23 | 1. type 不能由 proto生成 24 | 2. type 不能继承下方特性 25 | 3. type 不方便拓展 26 | 27 |
28 | 3.1.1 点击查看 struct 结构体实现 29 | 30 | ```go 31 | type RMB struct { 32 | int 33 | } 34 | 35 | // 实现 Stringer 接口 36 | func (rmb RMB) String() string { 37 | return fmt.Sprintf("¥%d", rmb.int) 38 | } 39 | 40 | func Main_3_01_b() { 41 | pricePencil := RMB{2} 42 | //pricePen := RMB{10} 43 | // %v 自动调用 Stringer 方法,格式化输出 44 | fmt.Printf("The price of Pencil is %v\n", pricePencil) 45 | // output: The price of Pencil is ¥2 46 | } 47 | ``` 48 | 49 |
50 | 51 | 52 |
53 | 3.1.2 点击查看 type 实现 54 | 55 | ```go 56 | type RMB int 57 | 58 | // 实现 Stringer 接口 59 | func (rmb RMB) String() string { 60 | return fmt.Sprintf("¥%d", rmb) 61 | } 62 | 63 | func Main_3_01() { 64 | pricePencil := RMB(2) 65 | pricePen := RMB(10) 66 | // %v 自动调用 Stringer 方法,格式化输出 67 | fmt.Printf("The price of Pencil is %v\n", pricePencil) 68 | // output: The price of Pencil is ¥2 69 | 70 | // type ,若底层基本数据类型一致,可直接运算 71 | fmt.Printf("Pencil is %v cheaper than pen\n", pricePen-pricePencil) 72 | // output: Pencil is ¥8 cheaper than pen 73 | } 74 | ``` 75 | 76 |
77 | 78 | ## 四、代码纠错/辩析(做) 79 | 80 | ### 4.1 纠错:关于指针与切片 81 | 以下代码的两个 `change` 函数造成的改动,都能成功生效吗? 82 | 如果不能,分别是因为什么原因?怎么写才是对的? 83 | 84 |
85 | 点击查看代码详情 86 | 87 | ``` go 88 | type personInfos struct { 89 | Filename string 90 | Persons []Person 91 | } 92 | 93 | type Person struct { 94 | Name string //标准名 95 | Alias []string //别名,可以是邮箱、QQ号等 96 | Submit bool // 是否已提交 97 | } 98 | 99 | 100 | func (p personInfos)ChangeSomeThingV1() { 101 | for _, person := range p.Persons { 102 | if person.Name == "随便写个判断意思一下" { 103 | person.Submit = true 104 | } 105 | } 106 | } 107 | 108 | func (p *personInfos)ChangeSomeThingV2() { 109 | for _, person := range p.Persons { 110 | if person.Name == "随便写个判断意思一下" { 111 | person.Submit = true 112 | } 113 | } 114 | } 115 | ``` 116 | 117 |
118 | 119 | ### 4.2 结构体嵌套字段的跨名冲突问题 120 | 121 |
122 | 点击查看代码 123 | 124 | ```go 125 | //Address 地址结构体 126 | type Address struct { 127 | Province string 128 | City string 129 | CreateTime string 130 | } 131 | 132 | //Email 邮箱结构体 133 | type Email struct { 134 | Account string 135 | CreateTime string 136 | } 137 | 138 | //User 用户结构体 139 | type User struct { 140 | Name string 141 | Gender string 142 | Address 143 | Email 144 | } 145 | 146 | func main() { 147 | var user3 User 148 | user3.Name = "pprof" 149 | user3.Gender = "女" 150 | // user3.CreateTime = "2019" //ambiguous selector user3.CreateTime 151 | user3.Address.CreateTime = "2000" //指定Address结构体中的CreateTime 152 | user3.Email.CreateTime = "2000" //指定Email结构体中的CreateTime 153 | } 154 | ``` 155 | 156 |
-------------------------------------------------------------------------------- /golang/framework.md: -------------------------------------------------------------------------------- 1 | # go 基本框架介绍 2 | 3 | // to be continued -------------------------------------------------------------------------------- /golang/package.md: -------------------------------------------------------------------------------- 1 | # Golang包管理历史 2 | 3 | ## 概述 4 | 5 | Golang由于是这几年火起来的,包管理的进步和演变还没有形成全网统一。 6 | 7 | 在刚开始学习golang的过程中,经常会被 `GOPATH` `go mod` `dep` 等包管理名词弄晕,在网上查阅相关文章时,可能仅仅一年前的文章还在讲 `GOPATH` ,因为 `go mod` 在 `go1.13` 才算正式代替了以前的包管理工具,距今的历史还很短。 8 | 9 | 种种原因导致了 `golang` 包管理学习的混乱,而了解这一历史是入门 `golang` 的必经之路,否则在你的项目中, `GOPATH` 和 `go mod` 的交织会造成很多问题。 10 | 11 | 下面会给出一些文章,看完基本就对其历史进程和使用有一个基本了解了 12 | 13 | ## 文章 14 | 15 | https://blog.wolfogre.com/posts/golang-package-history/ 包管理历史时间线概述 16 | 17 | https://learnku.com/docs/go-blog/modules2019/6489 `golang` 团队在 `2018` 年对 `go mod` 的展望和计划 18 | 19 | https://www.cyningsun.com/09-07-2019/package-management.html 包管理历史讲解 20 | 21 | https://youwu.today/skill/backend/using-go-modules/ 使用 `go mod` 22 | 23 | https://iswbm.com/273.html `go mod` 详解 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /golang/quickStart.md: -------------------------------------------------------------------------------- 1 | # Golang 后端速成 2 | 3 | ## Go 基础语法 - the tour of go 4 | 5 | 官方教程,交互式学习,简洁明了,快速入门 6 | 7 | * [英文原版](https://tour.golang.org/welcome/1):需科学上网,在线编译可用 8 | * [中文版](http://tour.studygolang.com/welcome/1):在线编译器不可用,建议搭配 goland 食用 9 | 10 | ## 这里插一节简单的网络知识、前后端交互课 11 | 12 | * [backend guide](../common/networkKnowledge.md) 13 | 14 | ## git 操作文档 15 | * [git教程](https://www.liaoxuefeng.com/wiki/896043488029600) 16 | * [backend guide](../git) 17 | 18 | 19 | ## Gin —— web 框架 20 | 21 | 框架不需要学得很细致,能上手开发就行,下同 22 | 23 | * [Gin Web Framework(官网)](https://gin-gonic.com/):请点击上方 Documentation,右上角可切换语言 24 | * [gin 某中文文档](https://www.topgoer.cn/docs/ginkuangjia/ginkuangjia-1c50hfaag99k2) 25 | 26 | ## Gorm —— 数据库操作框架 27 | 28 | * [GORM Guides(官方文档)](https://gorm.io/docs/):需科学上网,右上角可切换中文。搜索仅英文模式可用。 29 | -------------------------------------------------------------------------------- /jetBrains/README.md: -------------------------------------------------------------------------------- 1 | # 关于 jetbrains 家相关工具的使用 2 | 3 | ### [./](./) 4 | 5 | ### [../](../) 6 | 7 | ### [IDE 与管理](./commonware.md) 8 | 9 | ### [教育邮箱](./edu.md) 10 | -------------------------------------------------------------------------------- /jetBrains/commonware.md: -------------------------------------------------------------------------------- 1 | # JetBrains 2 | 3 | ## 介绍 4 | 5 | ### 安装 Goland IDE 6 | 7 | 下载安装包安装 8 | 9 | ### JetBrains Toolbox 安装 10 | 11 | -------------------------------------------------------------------------------- /jetBrains/edu.md: -------------------------------------------------------------------------------- 1 | # 教育 学生许可申请 2 | 3 | 可以使用杭电邮箱完成申请 4 | 5 | 6 | -------------------------------------------------------------------------------- /unix/Brew.md: -------------------------------------------------------------------------------- 1 | # BREW 2 | 3 | ## 简介 4 | 5 | 适用于个人Linux,不建议在服务端部署使用Brew 6 | 7 | Brew 主要使用 类 git 的方式来进行软件的更新 8 | 9 | ## 安装 10 | 11 | ```bash 12 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 13 | ``` 14 | 15 | ### Linux 还需要 16 | 17 | ```bash 18 | echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.profile 19 | eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" 20 | ``` 21 | 22 | ## 测试 23 | 24 | ```bash 25 | brew install hello 26 | ``` 27 | -------------------------------------------------------------------------------- /unix/Golang.md: -------------------------------------------------------------------------------- 1 | # Golang 安装 2 | 3 | ## 使用[`Brew`](./Brew.md) 4 | 5 | ```bash 6 | brew install golang 7 | ``` 8 | 9 | ## 从二进制文件安装 10 | 11 | ```bash 12 | cd ~ 13 | wget https://mirrors.ustc.edu.cn/golang/go1.17.2.linux-amd64.tar.gz 14 | sudo rm -rf /usr/local/go 15 | sudo tar -C /usr/local -xzf go1.17.2.linux-amd64.tar.gz 16 | echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.profile 17 | source ~/.profile 18 | ``` 19 | 20 | ## GOPATH 设置 21 | 22 | ```bash 23 | echo "export PATH=\$PATH:\$HOME/go/bin" >> ~/.profile 24 | ``` 25 | 26 | ## 使用`goproxy`代理依赖 27 | 28 | ```bash 29 | go env -w GOPROXY=https://goproxy.cn,direct 30 | ``` 31 | -------------------------------------------------------------------------------- /unix/Protobuf.md: -------------------------------------------------------------------------------- 1 | # Protobuf 2 | 3 | ## 使用 `Brew` 4 | 5 | ```bash 6 | brew install protobuf 7 | ``` 8 | 9 | ## 使用 `apt` 10 | 11 | ```bash 12 | sudo apt update 13 | sudo apt install -y protobuf-compiler 14 | ``` 15 | -------------------------------------------------------------------------------- /unix/README.md: -------------------------------------------------------------------------------- 1 | # UNIX 相关 2 | 3 | ### [./](./) 4 | 5 | ### [../](../) 6 | 7 | ### [Brew 包管理](./Brew.md) 8 | 9 | ### [Golang 安装](./Golang.md) 10 | 11 | ### [macOS 相关](./macOS.md) 12 | 13 | ### [快速开始](./quickstart.md) 14 | 15 | ### [shell 基础](./shell.md) -------------------------------------------------------------------------------- /unix/macOS.md: -------------------------------------------------------------------------------- 1 | # Apple Mac 操作系统 2 | 3 | ## [Brew](./Brew.md) 4 | 5 | ## Docker -------------------------------------------------------------------------------- /unix/quickStart.md: -------------------------------------------------------------------------------- 1 | # 快速入门 2 | 3 | ## 文件系统 cli 4 | 5 | ```bash 6 | cd $path #进入目录 7 | ``` 8 | 9 | ## 环境变量 10 | 11 | ```bash 12 | env #输出全部环境变量 13 | source $file #从文件加载环境变量 14 | echo $key #输出指定的环境变量 15 | ``` 16 | -------------------------------------------------------------------------------- /unix/shell.md: -------------------------------------------------------------------------------- 1 | # SHELL 2 | 3 | ## BASH 4 | 5 | 推荐课程为 6 | 7 | 你可以学到很多命令行下的操作与工作方式 以及以前人们是如何开发的 8 | 9 | 接触到很多好玩的命令行工具和命令行玩法 10 | 11 | ## ZSH & ohmyzsh 12 | 13 | Ubuntu 20.04 LTS 14 | 15 | ```bash 16 | sudo apt install zsh 17 | ``` 18 | 19 | ## 加载 `.profile` 20 | 21 | ```bash 22 | echo "if test -r ~/.profile; then . ~/.profile; fi" >> ~/.zshrc 23 | source ~/.zshrc 24 | ``` 25 | -------------------------------------------------------------------------------- /windows/README.md: -------------------------------------------------------------------------------- 1 | # Windows 环境配置 2 | 3 | ## WSL 简介 4 | 5 | 6 | 7 | ## 安装 WSL 8 | 9 | 在 Windows(10 及以上)的操作系统中[安装WSL](https://docs.microsoft.com/zh-cn/windows/wsl/install)(建议使用 [WSL2](https://docs.microsoft.com/zh-cn/windows/wsl/compare-versions#whats-new-in-wsl-2) ,本文档内容也以 WSL2 为基础) 10 | 11 | 推荐使用 Ubuntu 20.04 LTS,Microstoft Store [安装链接](https://www.microsoft.com/en-us/p/ubuntu-2004-lts/9n6svws3rx71) 12 | 13 | 使用WSL后系统环境将变得简单,其他相关的环境配置可以参考本导引[Unix内容](./../unix/) 14 | 15 | ### WSL 不继承 Windows 环境变量 16 | 17 | 避免出现一些不可控情况 18 | 19 | ```bash 20 | sudo nano /etc/wsl.conf #编辑文件`/etc/wsl.conf` 21 | ``` 22 | 23 | 加入以下内容 24 | 25 | ```toml 26 | [interop] 27 | appendWindowsPath = false 28 | ``` 29 | 30 | 在PowerShell中重启 WSL 31 | 32 | ```CMD 33 | WSL --shutdown 34 | ``` 35 | 36 | ### WSL 内部 Proxy 环境脚本 37 | 38 | 将下面函数加入到`~/.profile`中,记得编辑端口 39 | 40 | ```bash 41 | export hostip=$(cat /etc/resolv.conf |grep -oP '(?<=nameserver\ ).*') #获得网关地址 42 | export proxyPort=7890 #端口 43 | alias proxy=' 44 | export https_proxy="http://${hostip}:${proxyPort}"; 45 | export http_proxy="http://${hostip}:${proxyPort}"; 46 | export all_proxy="http://${hostip}:${proxyPort}"; 47 | echo -e "Acquire::http::Proxy \"http://${hostip}:${proxyPort}\";" | sudo tee -a /etc/apt/apt.conf.d/proxy.conf > /dev/null; 48 | echo -e "Acquire::https::Proxy \"http://${hostip}:${proxyPort}\";" | sudo tee -a /etc/apt/apt.conf.d/proxy.conf > /dev/null; 49 | ' 50 | alias unproxy=' 51 | unset https_proxy; 52 | unset http_proxy; 53 | unset all_proxy; 54 | sudo sed -i -e "/Acquire::http::Proxy/d" /etc/apt/apt.conf.d/proxy.conf; 55 | sudo sed -i -e "/Acquire::https::Proxy/d" /etc/apt/apt.conf.d/proxy.conf; 56 | ' 57 | ``` 58 | 59 | 测试可用性 60 | 61 | ```bash 62 | source ~/.profile #加载环境 63 | proxy #执行函数 代理生效 64 | curl https://www.google.com #请求Google 网址 65 | ``` 66 | 67 | ## [安装 Golang 语言环境](./../jetBrains/) 68 | 69 | ## Visual Studio Code 70 | 71 | 72 | --------------------------------------------------------------------------------