golang

1
2
3
4
5
6
7
初始化go.mod:
go mod init 项目名称
整理依赖:
go mod tidy
代理:
go env -w GOPROXY="https://goproxy.cn,direct"
-w参数代表修改后面变量的值,不带-w仅为查看变量的值
1
2
3
下载GO插件支持golang语言,下载gopls包进行代码提示,设置gopls的环境变量启动
GOPATH:是开发的工作目录。用于保存编译后的二进制文件。go get命令和go install命令会下载go的代码到GOPATH中。
使用GOPATH时,项目中import引用的第三方包,首先会从GOROOT/src下搜索,如果搜索不到,会到GOPATH/src目录下搜索。

proto

1
2
3
4
5
6
7
8
9
10
11
12
13
syntax = "proto3";

// 命名空间,需要与go_package的文件夹名字相同
package service;

// 作用于 --go_out=
option go_package = "./../../service";

// protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR --go_out=DST_DIR --ruby_out=DST_DIR --objc_out=DST_DIR --csharp_out=DST_DIR path/to/file.proto
message Student{
string name = 1;
int32 age = 2;
}
1
2
3
4
5
6
7
8
9
Go plugins for the protocol compiler:

Install the protocol compiler plugins for Go using the following commands:

$ go install google.golang.org/protobuf/cmd/protoc-gen-go
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
Update your PATH so that the protoc compiler can find the plugins:

$ export PATH="$PATH:$(go env GOPATH)/bin"
1
protoc --go_out=. --go-grpc_out=. .\xxx.proto

pip proxy

在C盘的用户,当前用户目录下新建pip文件夹,里面新建pip.ini文件,内容为

1
2
3
4
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn

函数选项模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package main

// CustomStruct your defined struct
type CustomStruct struct {
a string
b string
}

// func function type
type OptionFunc func(*CustomStruct)

// edit the value of a
func InsertA(a string) OptionFunc {
return func(o *CustomStruct) {
o.a = a
}
}

// edit the value of b
func InsertB(b string) OptionFunc {
if b == "" {
b = "Default value B"
}
return func(o *CustomStruct) {
o.b = b
}
}

// return object
func NewObject(opts ...OptionFunc) *CustomStruct {
o := &CustomStruct{}
for _, opt := range opts {
opt(o)
}
return o
}

func main() {
myObject := NewObject(InsertA("Inserted value"), InsertB(""))
println(myObject.b)
}

设计模式

创建模式(5种)

1.工厂模式

<1>. 简单工厂模式

使用工厂类创建多种产品对象

使用方便,不符合开闭原则(修改了原来的代码)

<2>. 工厂模式

多个工厂类实现一个工厂接口,使用工厂类生产不同的产品

类越来越多

2. 抽象工厂模式

多个工厂类实现一个工厂接口,每种产品类实现一种产品的接口,使用工厂类生产不同的产品

使用方便,归类清晰

违反开闭原则

3. 单例模式

保证一个全局唯一的变量对象

4. 建造者模式

抽象类Builder,包含各种加工产品的抽象方法,实现类Builder实现后创建产品类,对产品类进行各种修饰后返回产品对象。Director创建或接收实现类Builder后,调用Builder的部分加工产品的方法后获取产品对象。

可以分离构建和表示,可以自选加工方法,加工顺序等等,符合开闭原则

适用于产品变化不大,产品相同点多的场景

5. 原型模式

新建产品类后,产品类实现克隆接口,使用新建的这个产品类浅克隆一个新对象,深克隆需要重写克隆接口的方法

结构模式(7种)

1. 适配器模式

服务端类通过适配器类兼容其他接口类,首先用新建一个抽象适配器类,使用服务端类调用抽象适配器类的方法,适配器类实现抽象适配器类的方法,继承其他接口类的方法并调用方法(类适配器)或新建其他接口的对象并调用方法(对象适配器)

适配器可以把不同的适配者适配到同一个目标

单继承不能适配多个类,抽象类是接口,具有局限性

2. 桥接模式

使用接口来分类一次品牌,使用抽象类分类一次物品,抽象类包括接口品牌,这样就可以将两种类型分离,在增加物品的同时,可以选择品牌

违背单一继承原则,复用性差,类的个数多,减少了子类,维护性强,符合开闭原则

增加了设计难度,抽象层设计难度大,使用局限大

3. 代理模式

静态代理

出售人实现接口的方法,代理人实现接口的方法,代理人调用代理的实现的接口方法,购买人通过代理人来调用出售人实现的接口方法,代理人可以拥有自己独立的方法

出售人的代码更加简单,各种业务交给了代理人类,方便集中扩展

每个出售人都对应一个代理人,代码量翻倍,开发效率会降低

动态代理

基于接口的动态代理,基于类的动态代理,通过加载类实现的接口方法来执行,在方法执行前后可以添加任意代码。一个动态代理代理了一个接口,实现该接口的类都可以代理

4. 装饰者模式

装饰者和被装饰者实现同一个抽象的超类,实现类继承双方的同时,装饰者实现类要可以对被装饰者实现类进行接收修改

可以很方便的对被装饰者进行各种修改

5. 外观模式

由一个管理类创建销毁其他的各种类,客户类只需要调用管理类即可使用其他类

解耦,易于扩展和维护,使用简单,层次清晰,隐藏了子系统的细节

6. 组合模式

树枝树叶实现同一个接口,客户类可以很方便的使用树枝和树叶实现类,无需关心他们两个的区别

简化了客户端代码,很容易的添加对象,符合开闭原则

设计复杂,不容易新增功能,不容易限制组件

7. 享元模式

创建类的抽象接口或抽象类来定义公共属性方法,实现类继承接口或抽象类,使用工厂类创建实现类的同时还可以保证实现类的唯一性

减少了对象的创建,节省了内存

提高了系统的复杂度

关系模式(11种)

第一类 父类与子类

1. 策略模式

让策略类实现策略的抽象类或接口类,客户类调用策略抽象类或接口类

可以很方便的选择使用各种算法

策略类会越来越多,所有策略类都需要对外暴露

2. 模板方法模式

模板类是接口或者抽象类,实现类继承或实现模板类

代码复用率高,符合开闭原则

不同实现会新增子类,导致类的个数增多

第二类 两个类之间

3. 观察者模式

定义观察者和被观察者接口,被观察者保存观察者的列表,在需要通知时遍历列表通知观察者

观察者与被观察者是抽象耦合的

观察者数量太多时会花费很多时间来通知,观察者与被观察者不能很好的互相调用,观察者不知道被观察者是如何变化的

4. 迭代器模式

创建抽象或接口容器类以及迭代器类,分别拥有对应的具体实现类,容器类用于将其他的数据创建成迭代器类,迭代器类拥有取出下一个元素,移除当前元素等迭代器类方法

简化了容器类,新增容器类和迭代器类都很简单

会导致类的数量增加

5. 责任链模式

创建抽象或接口处理人类,创建他们的实现类,高层处理人类中包含低层的处理人类,如果高层处理类处理完后或不处理,可以交付给低一级的处理类

通过哦这种方法,可以实现多层过滤

6. 命令模式

请求者类调用抽象命令类,具体命令类实现抽象命令类并调用执行者类,实现相应的功能

第三类 类的状态

7. 备忘录模式

创建抽象或接口备忘录类,由发起人创建设置备忘录实现类的各种属性,由管理者保存取出备忘录的对象

8. 状态模式

定义抽象或接口状态模式,创建多个状态模式的实现类,创建抽象或接口环境类以及其实现类,实现类包含多个状态模式实现类,根据需要设置不同的当前状态实现类,从而拥有不同的行动

第四类 通过中间类

9. 访问者模式

首先定义抽象访问者,指明要访问哪些元素类,然后实现抽象访问者,在访问元素类时做什么,写一个抽象或接口元素类,用具体实例实现元素类,元素类可以调用访问类的方法来实现访问

10. 中介者模式

创建接口或抽象中介者类以及同事类,同事类之间的相互交流使用中介者类

11. 解释器模式

创建抽象表达式,各种表达式均实现抽象表达式,解释器的各种方法使用不同的表达式来实现

Golang二进制操作

正数的原码补码相同

负数的原码符号位不动,其余各位取反加一得到补码。

负数的补码符号位不动,其余各位取反加一得到原码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import "fmt"

func main() {
var num1 int8 = 1
var num2 int8 = 2
// 结果为1,因为num_1是奇数
fmt.Println(num1 & 1)
// 结果为0,因为num_2是偶数
fmt.Println(num2 & 1)
fmt.Printf("%b", int8(127))
fmt.Println()
// 正数的情况下以下两行等价
fmt.Printf("%b", int8(127)>>1)
fmt.Println()
fmt.Println(int8(127)/2)
// 正数的情况下以下两行等价
fmt.Printf("%b", int8(127)>>3)
fmt.Println()
// 除数为2的3次方
fmt.Println(int8(127)/8)
}

golang顺序打印数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
"fmt"
)

func main() {
m := make(map[int]string)

// 往map中添加键值对
m[1] = "one"
m[2] = "two"
m[3] = "three"

var keyArray []int
for key := range m {
// 数组自动排序
keyArray = append(keyArray, key)
}

// 遍历map
for _, value := range keyArray {
fmt.Println("Key:", value, "Value:", m[value])
}
}

Tomcat用户配置

1. 添加用户和权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# vim /opt/local/tomcat/conf/tomcat-users.xml
# 添加如下到文件中
'''
<tomcat-users>
<role rolename="manager-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="password" roles="manager-gui,manager-script,manager-status,admin-gui,admin-script"/>
</tomcat-users>
'''
# 权限说明
'''
权限说明
admin-gui — 可访问 "host管理" 页面,但"APP管理" 和 "服务器状态" 页面无查看权限
manager-gui — 无 "host管理" 页面访问权限,有"APP管理" 和 "服务器状态" 页面查看权限
manager-status — 只有"服务器状态" 页面查看权限
manager-script — 有脚本方式管理接口访问权限和"服务器状态" 页面查看权限
manager-jmx — JMX 代理接口访问权限和"服务器状态" 页面查看权限
admin-script — 只有host-manager脚本方式管理接口访问权限
'''

2. 修改访问ip配置

1
2
3
4
5
6
# vim /opt/local/tomcat/webapps/manager/META-INF/context.xml
# 如果没有特殊需求,可以将如下两行注释掉
'''
<!--<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />-->
'''

3. 重启Tomcat

1
2
# /opt/local/tomcat/bin/shutdown.sh # 停止
# /opt/local/tomcat/bin/startup.sh # 启动

VM Station配置本地网络

  1. VM Station菜单:编辑->虚拟网络编辑器->选中NAT模式->NAT设置,在这里可以看到网关IP,记录下来
  2. 编辑虚拟机的网络配置文件:
1
2
3
4
5
6
7
8
9
10
打开网络配置文件
vi /etc/sysconfig/network-scripts/ifcfg-ens33
将BOOTPORTO修改为static
将ONBOOT改为yes
新增:
一定要跟网关同段(例如192.168.235.100)
IPADDR=将要设置的IP地址
NETMASK=255.255.255.0
GATEWAY=192.168.235.2
DNS1=8.8.8.8
  1. service network restart启用新的网络设置
  2. 如果连接成功则完成
  3. 如果连接失败则打开电脑网络设置,重启vm的网络连接