30天学会Go--第6天 GO语言 RESTful API 学习与实践
30天学会Go–第6天 GO语言 RESTful API 学习与实践
文章目录
- 30天学会Go--第6天 GO语言 RESTful API 学习与实践
- 一、 RESTful API 的设计原则
- 1.1 RESTful API 的核心概念
- 1.2 RESTful API 的 URL 设计
- 1.3 RESTful API 的数据格式
- 二、 实现 RESTful API
- 2.1 定义数据模型
- 2.2 实现 CRUD 操作(增,删,改,查)
- 2.3 注册路由并启动服务器
- 3. 测试 RESTful API
- 3.1 使用 `curl` 测试(也可以使用 Postman , 这里只做简单测试,故使用 curl)
- 三、 总结
- 1. `net/http` 包
- 函数
- 接口和方法
- 2. `encoding/json` 包
- 函数
- 方法
- 3. `strconv` 包
- 函数
- 4. `fmt` 包
- 函数
- 5. `io` 包
- 接口
学习 RESTful API 是后端开发的重要环节,它是现代 Web 服务中最普遍的接口设计风格之一。以下将分为 学习内容 和 实践代码 两部分,帮助你快速上手 RESTful API 的设计与实现。
go语言官方编程指南:https://pkg.go.dev/stdopen in new window
go语言的官方文档学习笔记很全,推荐去官网学习
30天学会GO–第5天 GO语言 网络编程:30天学会Go–第5天 GO语言 网络编程-CSDN博客
一、 RESTful API 的设计原则
1.1 RESTful API 的核心概念
RESTful API 是一种基于 HTTP 协议的设计风格,强调资源的表现形式和操作。以下是 RESTful 的核心概念:
- 资源(Resource):
- 资源是 API 的核心,例如用户(
/users
)、文章(/articles
)。 - 每个资源通过一个唯一的 URL 表示,例如
/users/1
表示用户 ID 为 1 的资源。
- 资源是 API 的核心,例如用户(
- HTTP 方法:
- 不同的 HTTP 方法对应不同的操作:
GET
:获取资源。POST
:创建资源。PUT
:更新资源(整体替换)。PATCH
:更新资源(部分更新)。DELETE
:删除资源。
- 不同的 HTTP 方法对应不同的操作:
- 状态码(Status Code):
- 使用 HTTP 状态码表示操作结果:
200 OK
:请求成功。201 Created
:资源创建成功。204 No Content
:删除成功,无返回内容。400 Bad Request
:请求参数错误。404 Not Found
:资源不存在。500 Internal Server Error
:服务器内部错误。
- 使用 HTTP 状态码表示操作结果:
1.2 RESTful API 的 URL 设计
URL 是 RESTful API 的入口,设计时需要遵循以下原则:
- 使用名词表示资源:
- 正确:
/users
、/articles
。 - 错误:
/getUsers
、/createArticle
。
- 正确:
- 层次结构清晰:
- 资源的父子关系通过路径表示,例如:
/users/1
:表示用户 ID 为 1 的用户。/users/1/articles
:表示用户 ID 为 1 的所有文章。
- 资源的父子关系通过路径表示,例如:
- 避免动词:
- 操作由 HTTP 方法决定,而不是 URL。
- 使用复数形式:
- 资源通常使用复数形式,例如
/users
表示用户集合。
- 资源通常使用复数形式,例如
1.3 RESTful API 的数据格式
-
请求数据:
- URL 参数:适合传递简单的资源标识符,例如
/users/1
。 - Query 参数:适合传递筛选条件或分页信息,例如
/users?age=18&page=1&size=10
。 - JSON Body:适合传递复杂的数据结构,例如创建或更新资源时的数据。
- URL 参数:适合传递简单的资源标识符,例如
-
响应数据:
- 通常使用 JSON 格式返回数据:
{"id": 1,"name": "John Doe","email": "john.doe@example.com" }
- 通常使用 JSON 格式返回数据:
二、 实现 RESTful API
以下是一个完整的 RESTful API 示例,使用 Go 的 net/http
包实现。
2.1 定义数据模型
package mainimport ("encoding/json""fmt""net/http""strconv"
)type User struct {ID int `json:"id"`Name string `json:"name"`Email string `json:"email"`
}var users = []User{{ID: 1, Name: "Alice", Email: "alice@example.com"},{ID: 2, Name: "Bob", Email: "bob@example.com"},
}
解读:
-
定义用户结构体
-
User
是一个结构体,表示用户资源。ID
:用户的唯一标识符,类型为整数。Name
:用户的名称,类型为字符串。Email
:用户的电子邮件地址,类型为字符串。
-
JSON 标签:
- 每个字段后面的反引号部分(如
json:"id"
)是 JSON 的字段名标签。- 当将
User
转换为 JSON 时,字段名会使用标签中指定的名称。
- 当将
- 每个字段后面的反引号部分(如
-
-
初始化用户数据
-
定义了一个全局变量
users
,类型为[]User
(用户切片)。- 模拟了一个简单的“数据库”,存储了两个用户的初始数据:
- 用户 ID 为 1,名字为 “Alice”,邮箱为 “alice@example.com”。
- 用户 ID 为 2,名字为 “Bob”,邮箱为 “bob@example.com”。
- 模拟了一个简单的“数据库”,存储了两个用户的初始数据:
-
在实际开发中,这些数据通常存储在数据库中,而不是直接写在代码里。
-
2.2 实现 CRUD 操作(增,删,改,查)
GET 请求:获取所有用户
func getUsers(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(users)
}
功能:
- 提供一个接口,返回所有用户的数据。
- 数据以 JSON 格式返回。
解读:
- 设置响应头部:
w.Header().Set("Content-Type", "application/json")
:- 设置响应的
Content-Type
为application/json
,告诉客户端返回的数据是 JSON 格式。
- 设置响应的
- 编码 JSON 并写入响应:
json.NewEncoder(w).Encode(users)
:- 使用
json.NewEncoder
将全局变量users
(用户列表)编码为 JSON 格式,并写入http.ResponseWriter
,发送给客户端。
- 使用
GET 请求:获取单个用户
func getUser(w http.ResponseWriter, r *http.Request) {id, err := strconv.Atoi(r.URL.Query().Get("id"))if err != nil {http.Error(w, "Invalid user ID", http.StatusBadRequest)return}for _, user := range users {if user.ID == id {w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(user)return}}http.Error(w, "User not found", http.StatusNotFound)
}
功能:
- 根据用户 ID 查询单个用户。
- 如果用户存在,返回用户数据;否则返回
404 Not Found
。
解读:
- 获取用户 ID:
r.URL.Query().Get("id")
:- 从 URL 查询参数中获取
id
的值。 - 例如,
/users?id=1
中的id=1
。
- 从 URL 查询参数中获取
strconv.Atoi
:- 将字符串形式的 ID 转换为整数,方便后续比较。
- 错误处理:
- 如果
id
无法转换为整数,返回400 Bad Request
。
- 如果
- 查找用户:
- 遍历
users
列表,查找与id
匹配的用户。 - 如果找到用户,编码为 JSON 并返回。
- 遍历
- 用户未找到:
- 如果遍历结束后仍未找到用户,返回
404 Not Found
。
- 如果遍历结束后仍未找到用户,返回
POST 请求:创建用户
func createUser(w http.ResponseWriter, r *http.Request) {var newUser Usererr := json.NewDecoder(r.Body).Decode(&newUser)if err != nil {http.Error(w, "Invalid request body", http.StatusBadRequest)return}newUser.ID = len(users) + 1users = append(users, newUser)w.Header().Set("Content-Type", "application/json")w.WriteHeader(http.StatusCreated)json.NewEncoder(w).Encode(newUser)
}
功能:
- 创建一个新用户。
- 从请求的 JSON 数据中解析用户信息,并将其添加到用户列表中。
解读:
- 解析请求体:
json.NewDecoder(r.Body).Decode(&newUser)
:- 从请求体中读取 JSON 数据,并解析为
User
结构体。
- 从请求体中读取 JSON 数据,并解析为
- 错误处理:
- 如果解析失败(例如请求体不是有效的 JSON 格式),返回
400 Bad Request
。
- 如果解析失败(例如请求体不是有效的 JSON 格式),返回
- 分配新用户 ID:
newUser.ID = len(users) + 1
:- 新用户的 ID 是当前用户列表长度加 1。
- 这是一个简单的 ID 分配方式,实际项目中通常由数据库生成唯一 ID。
- 添加到用户列表:
users = append(users, newUser)
:- 将新用户追加到全局变量
users
列表中。
- 将新用户追加到全局变量
- 返回响应:
- 设置
Content-Type
为application/json
。 - 返回状态码
201 Created
,表示资源创建成功。 - 返回新创建的用户数据。
- 设置
PUT 请求:更新用户
func updateUser(w http.ResponseWriter, r *http.Request) {id, err := strconv.Atoi(r.URL.Query().Get("id"))if err != nil {http.Error(w, "Invalid user ID", http.StatusBadRequest)return}var updatedUser Usererr = json.NewDecoder(r.Body).Decode(&updatedUser)if err != nil {http.Error(w, "Invalid request body", http.StatusBadRequest)return}for i, user := range users {if user.ID == id {users[i].Name = updatedUser.Nameusers[i].Email = updatedUser.Emailw.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(users[i])return}}http.Error(w, "User not found", http.StatusNotFound)
}
功能:
- 根据用户 ID 更新用户信息。
- 如果用户存在,更新其数据;否则返回
404 Not Found
。
解读:
- 获取用户 ID:
- 同
getUser
,从查询参数中获取用户 ID,并转换为整数。
- 同
- 解析请求体:
- 使用
json.NewDecoder
解析请求体中的 JSON 数据。 - 错误处理:
- 如果请求体不是有效的 JSON 格式,返回
400 Bad Request
。
- 如果请求体不是有效的 JSON 格式,返回
- 使用
- 查找并更新用户:
- 遍历
users
列表,查找与id
匹配的用户。 - 如果找到用户,更新其
Name
和Email
。
- 遍历
- 返回响应:
- 如果更新成功,返回状态码
200 OK
和更新后的用户数据。 - 如果用户未找到,返回
404 Not Found
。
- 如果更新成功,返回状态码
DELETE 请求:删除用户
func deleteUser(w http.ResponseWriter, r *http.Request) {id, err := strconv.Atoi(r.URL.Query().Get("id"))if err != nil {http.Error(w, "Invalid user ID", http.StatusBadRequest)return}for i, user := range users {if user.ID == id {users = append(users[:i], users[i+1:]...)w.WriteHeader(http.StatusNoContent)return}}http.Error(w, "User not found", http.StatusNotFound)
}
功能:
- 根据用户 ID 删除用户。
- 如果用户存在,删除用户并返回
204 No Content
;否则返回404 Not Found
。
解读:
- 获取用户 ID:
- 同
getUser
,从查询参数中获取用户 ID,并转换为整数。
- 同
- 查找并删除用户:
- 遍历
users
列表,查找与id
匹配的用户。 - 如果找到用户,使用切片操作删除用户:
users = append(users[:i], users[i+1:]...)
:- 创建一个新的切片,跳过索引为
i
的用户。
- 创建一个新的切片,跳过索引为
- 遍历
- 返回响应:
- 如果删除成功,返回状态码
204 No Content
,表示删除完成且无返回内容。 - 如果用户未找到,返回
404 Not Found
。
- 如果删除成功,返回状态码
2.3 注册路由并启动服务器
func main() {http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {switch r.Method {case http.MethodGet:if r.URL.Query().Get("id") != "" {getUser(w, r)} else {getUsers(w, r)}case http.MethodPost:createUser(w, r)case http.MethodPut:updateUser(w, r)case http.MethodDelete:deleteUser(w, r)default:http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)}})fmt.Println("Server is running on http://localhost:8080")http.ListenAndServe(":8080", nil)
}
功能:
- 注册路由
/users
,根据 HTTP 方法调用不同的处理函数。 - 启动 HTTP 服务器,监听
8080
端口。
解读:
-
路由注册:
-
使用
http.HandleFunc
注册路由/users
。 -
根据
r.Method
(HTTP 方法)分发到不同的处理函数:
GET
:调用getUser
或getUsers
。POST
:调用createUser
。PUT
:调用updateUser
。DELETE
:调用deleteUser
。
-
如果方法不被支持,返回
405 Method Not Allowed
。
-
-
启动服务器:
http.ListenAndServe(":8080", nil)
:- 启动 HTTP 服务器,监听
8080
端口。 - 第二个参数为
nil
,表示使用默认的多路复用器。
- 启动 HTTP 服务器,监听
3. 测试 RESTful API
3.1 使用 curl
测试(也可以使用 Postman , 这里只做简单测试,故使用 curl)
-
获取所有用户:
curl -X GET http://localhost:8080/users
-
获取单个用户:
curl -X GET "http://localhost:8080/users?id=1"
-
创建用户:
curl -X POST -H "Content-Type: application/json" -d '{"name":"Charlie", "email":"charlie@example.com"}' http://localhost:8080/users
-
更新用户:
curl -X PUT -H "Content-Type: application/json" -d '{"name":"Updated Name", "email":"updated@example.com"}' "http://localhost:8080/users?id=1"
-
删除用户:
curl -X DELETE "http://localhost:8080/users?id=1"
三、 总结
在上述 RESTful API 实现中,我们使用了 Go 的标准库 net/http
和 encoding/json
,还有一些辅助包如 strconv
。
这些函数和方法共同构成了一个完整的 RESTful API 服务的基础工具集。通过这些工具,你可以高效地处理 HTTP 请求和响应,以及 JSON 数据的序列化和反序列化。
以下是每个包中用到的函数和方法的列表(想要深入了解请移步官网):
包名 | 函数/方法 |
---|---|
net/http | http.HandleFunc ,http.ListenAndServe ,http.Error ,w.Header().Set ,w.WriteHeader ,r.Method ,r.URL.Query().Get |
encoding/json | json.NewEncoder ,json.NewDecoder ,Encode ,Decode |
strconv | strconv.Atoi |
fmt | fmt.Println |
io | io.Reader ,io.Writer |
1. net/http
包
net/http
是 Go 标准库中用于构建 HTTP 服务的核心包。以下是我们使用的函数和方法:
函数
-
http.HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request))
- 功能:注册路由和对应的处理函数。
- 示例:
http.HandleFunc("/users", handler)
-
http.ListenAndServe(addr string, handler http.Handler) error
- 功能:启动 HTTP 服务器,监听指定的地址和端口。
- 示例:
http.ListenAndServe(":8080", nil)
-
http.Error(w http.ResponseWriter, error string, code int)
- 功能:快速返回带有状态码的错误响应。
- 示例:
http.Error(w, "Invalid user ID", http.StatusBadRequest)
接口和方法
-
http.ResponseWriter
- 用于构建 HTTP 响应。
- 方法:
Header() http.Header
- 功能:设置响应头。
- 示例:
w.Header().Set("Content-Type", "application/json")
Write([]byte)
- 功能:将字节数据写入响应体。
WriteHeader(statusCode int)
- 功能:设置 HTTP 状态码。
- 示例:
w.WriteHeader(http.StatusCreated)
-
http.Request
- 表示 HTTP 请求。
- 属性和方法:
Method string
- 功能:获取请求的 HTTP 方法(如
GET
、POST
)。 - 示例:
r.Method
- 功能:获取请求的 HTTP 方法(如
URL.Query() url.Values
- 功能:获取 URL 中的查询参数。
- 示例:
r.URL.Query().Get("id")
Body io.ReadCloser
- 功能:读取请求体。
- 示例:
json.NewDecoder(r.Body).Decode(&newUser)
2. encoding/json
包
encoding/json
是 Go 标准库中用于处理 JSON 数据的包。以下是我们使用的函数和方法:
函数
-
json.NewEncoder(w io.Writer)
- 功能:创建一个 JSON 编码器,将数据编码为 JSON 格式并写入
io.Writer
。 - 示例:
json.NewEncoder(w).Encode(users)
- 功能:创建一个 JSON 编码器,将数据编码为 JSON 格式并写入
-
json.NewDecoder(r io.Reader)
- 功能:创建一个 JSON 解码器,从
io.Reader
中读取并解析 JSON 数据。 - 示例:
json.NewDecoder(r.Body).Decode(&newUser)
- 功能:创建一个 JSON 解码器,从
方法
-
Encode(v interface{}) error
- 功能:将 Go 数据结构编码为 JSON 格式并写入
io.Writer
。 - 示例:
json.NewEncoder(w).Encode(users)
- 功能:将 Go 数据结构编码为 JSON 格式并写入
-
Decode(v interface{}) error
- 功能:将 JSON 数据解码到指定的 Go 数据结构。
- 示例:
json.NewDecoder(r.Body).Decode(&newUser)
3. strconv
包
strconv
是 Go 标准库中用于字符串和基本数据类型之间转换的包。以下是我们使用的函数:
函数
strconv.Atoi(s string) (int, error)
- 功能:将字符串转换为整数。
- 示例:
id, err := strconv.Atoi(r.URL.Query().Get("id"))
4. fmt
包
fmt
是 Go 标准库中用于格式化 I/O 的包。以下是我们使用的函数:
函数
fmt.Println(a ...interface{}) (n int, err error)
- 功能:打印一行内容到标准输出。
- 示例:
fmt.Println("Server is running on http://localhost:8080")
5. io
包
io
是 Go 标准库中处理流式数据的包。以下是我们间接使用的接口:
接口
-
io.Reader
- 功能:表示可以读取数据的对象。
- 示例:
r.Body
实现了io.Reader
接口,用于读取 HTTP 请求体。
-
io.Writer
- 功能:表示可以写入数据的对象。
- 示例:
w
(http.ResponseWriter
)实现了io.Writer
接口,用于写入 HTTP 响应。
相关文章:
30天学会Go--第6天 GO语言 RESTful API 学习与实践
30天学会Go–第6天 GO语言 RESTful API 学习与实践 文章目录 30天学会Go--第6天 GO语言 RESTful API 学习与实践一、 RESTful API 的设计原则1.1 RESTful API 的核心概念1.2 RESTful API 的 URL 设计1.3 RESTful API 的数据格式 二、 实现 RESTful API2.1 定义数据模型2.2 实现…...
数据分析特征标准化方法及其Python实现
数据分析特征标准化方法及其Python实现 1、概述 在数据分析中,对特征进行标准化主要是: 1、消除量纲影响 不同特征可能具有不同的量纲和数量级。 例如,一个特征可能是以米为单位的长度,而另一个特征可能是以秒为单位的时间。直接使用这些具有不同量纲的原始数据进行分析…...
【推导过程】常用共轭先验分布
文章目录 相关教程相关文献常用共轭先验分布预备知识贝叶斯统计后验分布的计算 正态均值(方差已知)的共轭先验分布是正态分布二项分布中的成功概率 θ 的共轭先验分布是贝塔分布正态均值(方差已知)的共轭先验分布是倒伽玛分布 作者:小猪快跑 基础数学&计算数学&…...
notepad++安装教程(超详细)
1.下载地址(可以私信博主) https://notepad-plus.en.softonic.com/download 2.解压安装...
Django快速入门
目录 1 创建django工程2 运行django3 Django工程目录详解4 开始一个app5 CBV和FBV6 使用模板7 使用模板语言8 自定义simple_tag Django 是用 Python 写的一个自由和开放源码 web 应用程序框架。 web框架是一套组件,能帮助你更快、更容易地开发web站点。当你开始构建…...
ISO45001职业健康安全管理体系认证流程
前期准备 领导决策:企业高层领导需认识到实施 ISO 45001 体系的重要性和必要性,做出认证决策,并承诺提供必要的资源支持。成立工作小组:由企业各相关部门人员组成工作小组,明确各成员的职责和分工,确保工作…...
Elasticsearch一分钟
参考 FST有穷状态转换器/咆哮位图/增量缩紧 Es技术难点 架构...
MFC中如何创建一个非模态对话框
对话框是编程中常用的一个控件,非模态对话框与用户交互更加友好,用户不必关闭对话框就能进行其他操作,比如拷贝黏贴,对比数据,执行其他命令。 由于无模态对话经常使用,且用法类似,因此我把它写…...
【设计模式】单例模式 在java中的应用
文章目录 引言什么是单例模式单例模式的应用场景单例模式的优缺点优点缺点 单例模式的基本实现饿汉式单例模式懒汉式单例模式双重检查锁定静态内部类枚举单例 单例模式的线程安全问题多线程环境下的单例模式线程安全的实现方式1. **懒汉式单例模式(线程不安全&#…...
北京2024年CSP-S/J 及NOIP游记
北京2024年CSP-S/J 及NOIP游记 2024.9 开学2024.9 CSP-S12024.9 停课2024.10假期 误入歧途2024.10 CSP-S2 冲刺 2024.9 开学 开学升入初三,9月的前半个月一直在搞文化课(把文化课搞得风生水起),经历了1天的校运动会(摆…...
vue 纯前端对接阿里云oss文件上传封装,支持批量多文件上传,大文件上传时拿到上传进度。
使用阿里云上传先看官方文档(阿里云官方文档) 我这边只做了简单上传和分片上传,也包含了粘贴上传和拖拽上传。 1.首页先安装 npm i ali-oss2.在utils下创建uploadOss.js const OSS require(ali-oss) import { getOsstoken } from /api/in…...
YOLO系列发展历程:从YOLOv1到YOLO11,目标检测技术的革新与突破
文章目录 前言一、YOLOv1:单阶段目标检测的开端二、YOLOv2:更精准的实时检测三、YOLOv3:阶梯特征融合四、YOLOv4:性能和速度的新平衡五、YOLOv5:易用性和扩展性的加强六、YOLOv6:工业部署的利器七、YOLOv7&…...
认识Java中的异常(半成品)
1.异常的概念与体系结构 1.1在Java中,将程序执行过程中发生的不正常行为称为异常.比如 1.算数异常 public class Main1 {public static void main(String[] args){System.out.println(10/0);} } //异常信息为:Exception in thread "main" java.lang.ArithmeticExc…...
Sqoop 指令语法手册
目录 help指令list-databases参数描述示例 codegen参数描述 Sqoop create-hive-table参数描述 eval参数描述 Export参数描述 import参数描述 import-all-tables参数描述 import-mainframe参数描述 job参数描述 list-tables参数描述 merge参数描述 help指令 sqoop help 下面的S…...
网络安全 - SQL Injection
1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。 网络…...
spi 发送与接收 移位写法
spi _tx 发送模块 片选信号cs可以在top顶层控制模块产生 timescale 1ns / 1psmodule spi_rom#(parameter SIZE 8 )(input wire clk ,input wire rst_n,input wire [SIZE-1:0] data ,input wire …...
MyBatis关联映射
目录 一、什么是关联注解? 二、数据库建表 1.学生表 2.教师表 三、一般查询 (1)创建StudentTeacher类 (2)mapper层 (3)Dao接口 (4)Test类 (5&#x…...
通过华为鲲鹏认证的软件产品如何助力信创产业
软件通过华为鲲鹏认证与信创产业有着密切的联系。鲲鹏认证是华为推动信创产业发展的一项重要举措,通过该认证,软件可以在华为的生态系统中实现更好的兼容性和性能优化,从而推动信创产业的全面发展和国产化替代。 鲲鹏认证的定义和重要性 鲲…...
陈志刚解读:国家数据基础设施建设解读(附下载)
本期分享陈志刚解读:国家数据基础设施建设解读,从背景意图、概念内涵、发展愿景与总体功能、总体架构、重点方向、算力底座、网络支撑、安全防护和组织保障十个方面展开,共52页ppt。 加入星球可获取完整版资料 篇幅限制,部分内容…...
QT 中 sqlite 数据库使用
一、前提 --pro文件添加sql模块QT core gui sql二、使用 说明 --用于与数据库建立连接QSqlDatabase--执行各种sql语句QSqlQuery--提供数据库特定的错误信息QSqlError查看qt支持的驱动 QStringList list QSqlDatabase::drivers();qDebug()<<list;连接 sqlite3 数据库 …...
VPN设备
定义: 虚拟专用网络指的是在公用网络上建立专用网络的技术。之所以称为虚拟网主要是因为整个VPN网络的任意两个节点之间的连接并没 有传统专网所需的端到端的物理链路,而是架构在公用网络服务商所提供的网络平台之上的逻辑网络,用户数据在逻辑链路中传输…...
centos部署SkyWalking并在springcloud项目中用法举例
文章目录 场景SkyWalking介绍部署部署Storage [单机版Elasticsearch]部署SkyWalking OAP [下载地址](https://skywalking.apache.org/downloads/#SkyWalkingAPM)部署SkyWalking Java AgentspringCloud 使用举例 场景 SkyWalking是应用性能监控平台,可用于分布式系统…...
[创业之路-186]:《华为战略管理法-DSTE实战体系》-1-为什么UTStarcom死了,华为却活了,而且越活越好?
目录 前言 一、市场定位与战略选择 二、技术创新能力 三、企业文化与团队建设 四、应对危机的能力 五、客户为中心的理念 六、市场适应性与战略灵活性 七、技术创新与研发投入 八、企业文化与团队建设 九、应对危机的能力 前言 UT斯达康(UTStarcom&#…...
算法设计5_分支限界法
分支限界法 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树,裁剪那些不能得到最优解的子树以提高搜索效率。 步骤: ① 定义解空间(对解编码); ② 确定解空间的树结构; ③ 按BFS等方式搜索: a.每个活…...
【设计模式系列】状态模式(二十三)
一、什么是状态模式 状态模式(State Pattern)是一种行为设计模式,其核心目的是管理一个对象在其内部状态改变时的行为变化,其核心理念是将对象的行为和状态分离。这种模式通过将每个状态相关的行为封装在独立的类中,使…...
github创建发布分支
创建一个名为 latest 的分支,并将其作为稳定版本分支。以下是操作步骤: 1. 创建 latest 分支 首先,确保你在 master 分支(或当前的稳定版本分支)上,并且已经提交了所有更改。然后,你可以创建一…...
【Linux】网络服务
声明,以下内容均学习自《Linux就该这么学》一书 1、创建网络会话 Linux系统使用NetworkManager提供网络服务,它是一种动态管理网络配置的守护进程,能够让网络设备保持连接状态。 nmcli nmcli是一款基于命令行的网络配置工具,它…...
错题:Linux C语言
题目:手写代码:判断一个数(int类型的整数)中有有多少1 题目:手写代码:判断一个数(转换成二进制表示时)有几个1 #include <stdio.h> int main(int argc, const char *argv[]) { //判断一个数…...
机器学习期末速成
文章参考自B站机器学习期末速成课 本文仅作者个人复习使用 一、机器学习分类 聚类和分类的区别: 分类:一开始就知道有哪些类别 聚类:一开始不知道有哪些类别 损失函数:简单来说就是你预测出来的结果和真实值的差距。 0-1损失函数…...
【学习总结|DAY015】Java面向对象高级-抽象类、接口
引言 在今天的课程中,我们详细探讨了 Java 编程语言的几个核心特性:多态、final 关键字、抽象类和接口。这些概念是面向对象编程的基础,对于构建健壮、可维护的应用至关重要。本文将通过具体的例子和解释帮助大家更好地掌握这些知识点。 一…...
单词拼写纠正-04-161.力扣 相隔为 1 的编辑距离
拼写纠正系列 NLP 中文拼写检测实现思路 NLP 中文拼写检测纠正算法整理 NLP 英文拼写算法,如果提升 100W 倍的性能? NLP 中文拼写检测纠正 Paper java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊! 一个提升英文单词拼…...
深入理解 NumPy 广播机制:从基础到应用
目录 什么是广播机制?广播机制的规则广播机制示例1. 一维数组与标量运算2. 二维数组与一维数组运算3. 维度不同的数组运算4. 广播失败的情况 广播机制的实际应用场景1. 数据归一化2. 批量计算欧氏距离 总结广播机制的核心要点: 在使用 NumPy 进行数组操作…...
Springboot(五十三)SpringBoot3整合redisson
前边我们有记录Springboot2/3整合redis的方式。是基于Springboot默认集成的Lettuce客户端实现的。 今天我们在项目中集成的redission是在Lettuce之上构建的redis客户端。 Redisson:一个在Jedis和Lettuce之上构建的Redis客户端。提供了一系列分布式Java对象和服务,比如:分布式…...
UAC2.0 speaker——带反馈端点的 USB speaker(16bit 单声道)
UAC2.0 speaker 系列文章 UAC2.0 speaker——单声道 USB speaker(16bit) UAC2.0 speaker——类特殊请求 UAC2.0 speaker——音量控制 UAC2.0 speaker——多采样率支持 UAC2.0 speaker——24/32bit 支持 UAC2.0 speaker——speaker 数据传输 UAC2.0 speaker——同时支持 16bi…...
P2562 [AHOI2002] Kitty猫基因编码
P1498P2562 [AHOI2002] Kitty猫基因编码 #include <iostream> using namespace std; #include <cmath> #include <vector> #include <string> string encode(string str){if(str.find("0") string::npos) return "B";if(str.fin…...
HarmonyOS(65) ArkUI FrameNode详解
Node 1、Node简介2、FrameNode2.1、创建和删除节点2.2、对FrameNode的增删改2.3 FramNode的查询功能3、demo源码4、总结5、参考资料1、Node简介 在HarmonyOS(63) ArkUI 自定义占位组件NodeContainer介绍了自定义节点复用的原理(阅读本本篇博文之前,建议先读读这个),在Node…...
40分钟学 Go 语言高并发:负载均衡与服务治理
负载均衡与服务治理 一、知识要点总览 模块核心内容技术实现难度负载策略轮询、权重、最小连接数自定义负载均衡器中服务降级服务降级、熔断降级、限流降级Hystrix模式高熔断机制熔断器状态机、失败计数、自动恢复Circuit Breaker高限流设计令牌桶、滑动窗口、计数器Rate Lim…...
Python 从入门到实战45(Pandas数据操作)
我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们学习了pandas数据读写的相关基础知识。今天学习一下…...
node js 历史版本下载
此为node历史版本下载地址 https://nodejs.org/dist/https://nodejs.org/dist/...
无代码探索AI大模型:腾讯云函数计算的卓越实践
在数字化转型的浪潮中,人工智能(AI)技术已经成为企业提升竞争力的关键。然而,对于许多业务人员来说,技术门槛高、开发周期长等问题限制了他们快速探索和应用AI大模型的能力。同时,对于缺乏GPU资源的开发者来…...
网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术
网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术 在当今的大数据时代,网络爬虫技术已经成为获取信息的重要手段之一。Python凭借其强大的库支持,成为了进行网页数据抓取的首选语言。在众多的爬虫库中,BeautifulSoup和Scra…...
vivado中,generate output product 和Create HDL wrapper的作用
generate output product 以zynq的ip核举例,没有generate output product之前,在ip source 什么也看不到。 但是同样的一个ip核,generate output product之后,会生成综合,布线和仿真文件,约束文件等等。 …...
欧盟R156法规注意事项及实例展示
欧盟 R156 法规即《关于批准车辆的软件升级和软件升级管理体系统一规定的法规》,其注意事项及实例如下: 注意事项: 软件升级管理体系方面: 体系建立与维持:汽车制造商和供应商必须建立完善的软件升级管理体系ÿ…...
HTML语义化的案例分析
HTML语义化的案例分析:对比实际网站中语义化与非语义化标签的差异 在现代Web开发中,HTML语义化被广泛认为是提升网页结构和可访问性的重要做法。HTML语义化不仅仅是为了让代码更清晰,更是为了增强搜索引擎优化(SEO)&a…...
使用 pyperclip 进行跨平台剪贴板操作
简介:pyperclip 是一个轻量级的 Python 库,支持在不同操作系统(Windows、macOS、Linux)中进行剪贴板的复制和粘贴。这个库的设计简单易用,非常适合需要频繁进行文本复制粘贴操作的场景。 历史攻略: 使用f…...
微信小程序报错:http://159.75.169.224:7300不在以下 request 合法域名列表中,请参考文档
要解决此问题,需打开微信小程序开发者工具进行设置,打开详情-本地设置重新运行,该报错就没有啦...
Java:181 基于springboot的考编论坛管理系统
作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统一共管理员,用户角色。 主要功能:收货地址管理、经验交流平台管理、公告信息管理、跳蚤市场管理、商品留言管理、商品订…...
通义千问sft-甄嬛对话
流程步骤 https://www.datawhale.cn/activity/110/21/76?rankingPage1 按照上面的流程,准备好数据之后就可以直接对7b的模型进行指令微调了,整个流程不是很复杂,操作起来比较方便。但是发布服务等了较长时间,以为出了bug 结果展…...
如何配置Jackson以忽略Java类中为null或空(empty)的字段
Jackson库提供了JsonInclude注解和ObjectMapper配置选项,可以用来控制是否在JSON输出中包含null或空值的字段。 默认情况下,Jackson会包含所有字段,不论其值为何。 本教程将展示如何使用Include.NON_NULL来忽略null值字段,以及使…...
设置笔记本同时连接内外网
原理:通过笔记本和手机相连,实现双网卡功能能。笔记本连接内网wifi、同时手机端开启usb网络共享,笔记本就有了两个网,然配置那个访问外网,那个访问内网。 1.笔记本wifi连接内网wifi 2.手机端共享网络。 手机打开 -【…...