meowrain

MeowRain

Life is Simple

Go 错误处理

panic,recover 在 Go 语言中,panic 和 recover 是用于处理程序错误和恢复的两个关键机制。 panic: panic 是一个内建函数,用于表示程序发生了无法处理的错误。当发生 panic 时,程序会立即停止执行当前函数的剩余代码,并开始在调用栈中向上逐层执行 deferred 函数,直到达到当前协程的最顶层(即程序的入口函数),然后程序将终止并输出 panic 信息。 panic 通常用于表示不可恢复的错误,比如空指针引用、数组越界等,或者是程序运行过程中的一些不合法操作。 recover: recover 也是一个内建函数,用于在 defer 延迟执行的函数中捕获 panic 引起的错误,使程序能够继续执行而不会被终止。 recover 只能在 defer 中调用,并且只在发生 panic 时才会生效。如果在没有 panic 的情况下调用 recover,它将返回 nil。 当 recover 在 defer 中调用时,如果有 panic 发生,它将会返回被传递给 panic 的值,并且程序将继续执行而不会终止。 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 package main import ( "fmt" ) func recoverFromPanic() { if r := recover(); r !

Go Gob

介绍 Go的gob是Go语言标准库中的一种序列化/反序列化格式,主要用于在编码和解码时传输和存储Go数据结构。Gob格式专为Go语言设计,提供了一种高效的二进制编码方式,特别适合在网络通信和文件存储中使用。 以下是Go的gob包的一些关键特性和使用方法: 特性 高效的二进制编码:Gob格式比JSON和XML等文本格式更为紧凑和高效,因为它使用二进制表示数据。 面向Go语言:Gob格式支持Go语言中的复杂数据结构,包括嵌套结构、切片、映射等。 自动化的编码和解码:使用gob包可以自动处理编码和解码过程,无需手动序列化和反序列化。 例子 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 package main import ( "bytes" "encoding/gob" "fmt" "log" "os" ) type Person struct { Name string Age int } func main() { // 创建一个Person实例 person := Person{Name: "Alice", Age: 30} // 创建一个缓冲区来存储编码后的数据 var buf bytes.

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
0%