meowrain

MeowRain

Life is Simple

Go Json解码和编码

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 vcard.go package vcard import ( "time" ) type Address struct { Street string HouseNumber uint32 HouseNumberAddOn string POBox string ZipCode string City string Country string } type VCard struct { FirstName string LastName string NickName string BirtDate time.Time Photo string Addresses map[string]*Address } 1 2 3 4 5 6 7 8 9 10 11 jsonUtil.

设计模式

[TOC] 面向对象相关知识 面向对象类关系(继承、实现、依赖、关联、聚合、组合):https://www.cnblogs.com/zhongj/p/11169780.html UML: https://blog.csdn.net/quyingzhe0217/article/details/133683814 创建型模式 创建型设计模式包括以下几种常见的模式: 工厂模式(Factory Pattern):通过工厂方法或抽象工厂来创建对象,将对象的创建过程封装起来,使得客户端代码与具体类解耦。 抽象工厂模式(Abstract Factory Pattern):提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供一个全局访问点来访问该实例。 建造者模式(Builder Pattern):将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。 原型模式(Prototype Pattern):通过复制现有对象来创建新对象,而不是通过实例化来创建。 结构型模式 结构型设计模式主要包括以下几种常见的模式: 适配器模式(Adapter Pattern):将一个类的接口转换成客户端所期望的另一个接口,使得原本不兼容的类可以一起工作。 桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们可以独立地变化,从而提高系统的灵活性。 组合模式(Composite Pattern):将对象组合成树形结构,以表示“部分-整体”的层次结构,使得客户端可以统一地处理单个对象和组合对象。 装饰器模式(Decorator Pattern):动态地给对象添加额外的职责,同时又不改变其接口。 外观模式(Facade Pattern):提供一个统一的接口,用于访问子系统中的一组接口,从而简化客户端与子系统之间的交互。 享元模式(Flyweight Pattern):通过共享细粒度的对象,以减少内存使用和提高性能。 代理模式(Proxy Pattern):为其他对象提供一个代理,以控制对这个对象的访问。 行为模式 行为型设计模式主要包括以下几种常见的模式: 观察者模式(Observer Pattern):定义了一种一对多的依赖关系,使得多个观察者对象可以同时监听并收到被观察者对象的通知。 策略模式(Strategy Pattern):定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,从而使算法的变化独立于使用算法的客户端。 命令模式(Command Pattern):将请求封装成对象,以使得可以用不同的请求对客户端进行参数化,同时支持请求的排队、记录和撤销。 迭代器模式(Iterator Pattern):提供一种顺序访问聚合对象中各个元素的方法,而又不暴露该对象的内部表示。 状态模式(State Pattern):允许对象在内部状态发生改变时改变其行为,使对象看起来像是修改了其类。 责任链模式(Chain of Responsibility Pattern):将请求的发送者和接收者解耦,使多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合关系。 访问者模式(Visitor Pattern):在不改变被访问类的前提下,定义了一种新的访问操作,使得可以在不修改被访问类的情况下对其进行操作。 中介者模式(Mediator Pattern):定义了一个中介对象,封装了一组对象之间的交互方式,使其能够独立地改变交互方式。 备忘录模式(Memento Pattern):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,从而可以在以后恢复到这个状态。 解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,用于解释语言中的句子。 工厂方法模式 factory_method 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。 问题: 假设你正在开发一款物流管理应用。 最初版本只能处理卡车运输, 因此大部分代码都在位于名为 卡车的类中。 一段时间后, 这款应用变得极受欢迎。 你每天都能收到十几次来自海运公司的请求, 希望应用能够支持海上物流功能。

Go Flag库使用

使用详情见 https://pkg.go.dev/flag https://www.liwenzhou.com/posts/Go/flag/ 例子 写一个模拟git命令的 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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 package main import ( "flag" "fmt" "os" ) func main() { // 定义子命令 initCmd := flag.

HTTP状态码

1xx 状态码 API 不需要1xx状态码,下面介绍其他四类状态码的精确含义。 2xx 状态码 200状态码表示操作成功,但是不同的方法可以返回更精确的状态码。 GET: 200 OK POST: 201 Created PUT: 200 OK PATCH: 200 OK DELETE: 204 No Content 上面代码中,POST返回201状态码,表示生成了新的资源;DELETE返回204状态码,表示资源已经不存在。 3xx 状态码 API 用不到301状态码(永久重定向)和302状态码(暂时重定向,307也是这个含义),因为它们可以由应用级别返回,浏览器会直接跳转,API 级别可以不考虑这两种情况。 API 主要是用303 See Other,表示参考另一个 URL。它与302和307的含义一样,也是”暂时重定向”,区别在于302和307用于GET请求,而303用于POST、PUT和DELETE请求。收到303以后,浏览器不会自动跳转,而会让用户自己决定下一步怎么办。下面是一个例子。 HTTP/1.1 303 See Other Location: /api/orders/12345 4xx 状态码 4xx 状态码表示客户端错误,主要有下面几种: 400 Bad Request:服务器不理解客户端的请求,未做任何处理。 401 Unauthorized:用户未提供身份验证凭据,或者没有通过身份验证。 403 Forbidden:用户通过了身份验证,但是不具有访问资源所需的权限。 404 Not Found:所请求的资源不存在,或不可用。 405 Method Not Allowed:用户已经通过身份验证,但是所用的 HTTP 方法不在他的权限之内。 410 Gone:所请求的资源已从这个地址转移,不再可用。 415 Unsupported Media Type:客户端要求的返回格式不支持。比如,API 只能返回 JSON 格式,但是客户端要求返回 XML 格式。 422 Unprocessable Entity :客户端上传的附件无法处理,导致请求失败。 429 Too Many Requests:客户端的请求次数超过限额。

Docker安装mysql

Docker安装mysql 1 2 3 4 $ docker pull mysql:latest $ cd ~ $ mkdir mysql $ cd mysql 1 $ docker run -p 3306:3306 --name mysql -v $PWD/conf/my.cnf:/etc/mysql/my.cnf -v $PWD/logs:/logs -v $PWD/data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql 连接mysql https://docs.fedoraproject.org/en-US/quick-docs/installing-mysql-mariadb/ 可以参考一下官方文档 1 $ sudo dnf install community-mysql-server 1 $ mysql -h 127.0.0.1 -P 3306 -u root -p123456

Docker容器技术

原文链接: https://www.yuque.com/qingkongxiaguang/zwhkpi/kq6rlg Docker容器技术 Docker是一门平台级别的技术,涉及的范围很广,所以,在开始之前,请确保你完成:Java SpringBoot 篇(推荐完成SpringCloud篇再来)视频教程及之前全部路线,否则学习会非常吃力,另外推荐额外掌握:《计算机网络》、《操作系统》相关知识。学一样东西不能完全靠记忆来完成,而是需要结合自己所学的基础知识加以理解,一般来说,单凭记忆能够掌握的东西往往是最廉价的。 **Docker官网:**https://www.docker.com **课前准备:**配置2C2G以上Linux服务器一台,云服务器、虚拟机均可。 容器技术入门 随着时代的发展,Docker也逐渐走上了历史舞台,曾经我们想要安装一套环境,需要花费一下午甚至一整天来配置和安装各个部分(比如运行我们自己的SpringBoot应用程序,可能需要安装数据库、安装Redis、安装MQ等,各种各样的环境光是安装就要花费很多时间,真的是搞得心态爆炸),而有了Docker之后,我们的程序和环境部署就变得非常简单了,我们只需要将这些环境一起打包成一个镜像。而到服务器上部署时,可以直接下载镜像实现一键部署,是不是很方便? 包括我们在学习SpringCloud需要配置的各种组件,可能在自己电脑的环境中运行会遇到各种各样的问题(可能由于电脑上各种环境没配置,导致无法运行),而现在只需要下载镜像就能直接运行,所有的环境全部在镜像中配置完成,开箱即用。 真的有这么神奇吗?我们来试试看。 环境安装和部署 首先我们还是先将Docker环境搭建好(建议和我同一个环境,不然出了问题只能自己想办法了),这里我们使用: Ubuntu 22.04 操作系统 Docker分为免费的CE(Community Edition)社区版本和EE(Enterprise Edition)企业级付费版本,所以我们这里选择docker-ce进行安装。官方安装文档:https://docs.docker.com/engine/install/ubuntu/ 首先安装一些工具: 1 sudo apt-get install ca-certificates curl gnupg lsb-release 不过在Ubuntu22.04已经默认安装好了。接着安装官方的GPG key: 1 2 3 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 最后将Docker的库添加到apt资源列表中: 1 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 接着我们更新一次apt: 1 sudo apt update 最后安装Docker CE版本:

Docker用代理拉取镜像

配置代理 打开/usr/lib/systemd/system/docker.service,在[Service]域中添加以下参数: 1 2 3 Environment="HTTP_PROXY=http://proxy-addr:port/" # 代理服务器地址 Environment="HTTPS_PROXY=http://proxy-addr:port/" # https Environment="NO_PROXY=localhost,127.0.0.1" # 哪些地址不需要走代理 更新配置,启动服务 1 2 systemctl daemon-reload systemctl restart docker.service

Go实现递归向下分析

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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 package main import ( "bufio" "fmt" "os" "strings" ) var ( str []byte pointer int error_str string = "Error: 非法的符号串" withNoSharp string = "Error: 符号串必须以#结尾" ) // 打印颜色设置 const Red = "\033[31m" const Green = "\033[32m" const Reset = "\033[0m" const Yellow = "\033[33m" func match(token byte) { if pointer >= len(str) { errors(error_str) return } if str[pointer] == token { pointer++ } else { errors(error_str) } } func errors(info string) { fmt.

Go数组和切片联系

Go数组和切片练习 数组 练习1:证明当数组赋值时,发生了数组内存拷贝。 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() { arr1 := new([5]int) arr2 := arr1 arr2[1] = 3 fmt.Println(arr1) //&[0 3 0 0 0] fmt.Println(arr2) //&[0 3 0 0 0] arr3 := [5]int{1, 2, 3, 4, 5} arr4 := &arr3 //使用&获取地址,修改arr4也会修改arr3 arr4[2] = 6 fmt.Println(arr3) //[1 2 6 4 5] fmt.
0%