go数据结构学习笔记
本博文较为完整的实现了go的链表、栈,队列,树,排序,链表包括顺序链表,双向链表,循环链表,队列是循环队列,排序包含冒牌、选择
1.链表
1.1 顺序链表
type LNode struct {data intnext *LNode
}
type LinkList *LNode// 初始化链表
func InitList() *LNode {l := &LNode{}return l
}// 插入链表
func (l *LNode) ListInsert(index int, value int) {p := lj := 0for p != nil && j < index-1 {p = p.nextj++}if p == nil {fmt.Println(p, j, index-1)fmt.Println("链表插入出点问题")return}s := &LNode{data: value}s.next = p.nextp.next = s
}// 删除
func (l *LNode) ListDelete(value int) {p := l.nextvar q *LNodefor p != nil {if p.data == value {if q == nil {l.next = p.next} else {q.next = p.next}}q = pp = p.next}
}// 查找
func (l *LNode) ListSearch(value int) *LNode {p := l.nextfor p != nil {//fmt.Println(p.data)if p.data == value {return p}p = p.next}return nil
}// 修改
func (l *LNode) ListModify(oldValue int, value int) {search := l.ListSearch(oldValue)if search != nil {search.data = value}
}
func (l *LNode) PrintL() {p := l.next // 从头节点的下一个开始遍历for p != nil {fmt.Printf("%d ", p.data) // 打印数据p = p.next}
}
func main() {l := InitList()l.ListInsert(1, 1)l.ListInsert(1, 2)l.ListInsert(1, 3)l.ListInsert(1, 4)l.ListInsert(1, 5)l.ListInsert(1, 6)l.PrintL()l.ListDelete(4)fmt.Println()l.PrintL()p := l.ListSearch(2)if p != nil {fmt.Println("\np value is :", p.data)}l.ListModify(2, 55)l.PrintL()
}

1.2 循环链表
type CirNode struct {data intnext *CirNode
}var CirList *CirNode
var CirRear *CirNodefunc InitCirList() *CirNode {node := &CirNode{data: 0, next: nil}node.next = nodereturn node
}func CreateCList(l *CirNode, data []int, n int) {r := lvar s *CirNodefor i := 0; i < n; i++ {s = &CirNode{}s.data = data[i]fmt.Println(data[i])s.next = r.nextr.next = sr = s}
}// 打印
func (l *CirNode) PrintList() {p := l.nextfor p != l {fmt.Printf("%d ", p.data)p = p.next}fmt.Println()
}// 查找,修改,删除
func (first *CirNode) DeleteNode(index int) {p := first.nextpre := firstcnt := 1for p != first && cnt < index {pre = pp = p.nextcnt++}pre.next = p.next
}func (first *CirNode) SarchValue(value int) {p := first.nextfor p != first {if p.data == value {break}p = p.next}if p == first {fmt.Println("未找到")}
}// 修改
func (first *CirNode) ModifyValue(value int, ele int) {p := first.nextfor p != first {if p.data == value {p.data = elebreak}p = p.next}}
func main() {lst := InitCirList()data := []int{1, 2, 3, 4}CreateCList(lst, data, 4)lst.PrintList()lst.DeleteNode(2)lst.PrintList()lst.SarchValue(1)lst.SarchValue(2)lst.PrintList()lst.ModifyValue(1, 94)lst.PrintList()
}

1.3 双向链表
type DuLNode struct {data intprior *DuLNodenext *DuLNode
}// 增加,删除,查找,修改
func (dL *DuLNode) Add(i int, val int) {if dL.next == nil || i <= 0 {fmt.Println("插入位置错误")}p := dL.nextcnt := 1for p != dL && cnt < i {p = p.nextcnt++}s := &DuLNode{}s.data = vals.prior = p.priors.prior.next = ss.next = pp.prior = s}func (dL *DuLNode) Print() {p := dL.nextfor p != dL {fmt.Printf("%d ", p.data)p = p.next}
}
func (dL *DuLNode) SearchKey(val int) {p := dL.nextfor p != dL {if p.data == val {break}}if p == dL {fmt.Println("没找到")}
}
func (dL *DuLNode) ModifyKey(val int, ele int) {p := dL.nextfor p != dL {if p.data == val {break}}}
func main() {dL := &DuLNode{}dL.next = dLdL.prior = dLdL.Add(1, 1)dL.Add(1, 2)dL.Add(1, 3)dL.Add(1, 4)dL.Add(1, 5)dL.Add(1, 6)dL.Add(1, 7)dL.Add(1, 8)dL.Print()
}

2.栈
2.1 顺序栈
type SNode struct {data []intTop intMaxSize int
}var Stack *SNode
var PtrToStack *SNodefunc NewSNode(MaxSize int) *SNode {return &SNode{data: make([]int, MaxSize), Top: -1, MaxSize: MaxSize}
}// 判断堆栈是否空
func (s *SNode) IsEmpty() bool {return s.Top == -1
}// 判断堆栈是否为满
func (s *SNode) IsFull() bool {return s.Top == s.MaxSize-1
}// 压入堆栈
func (s *SNode) Push(v int) {if s.IsFull() {fmt.Println("栈满")return} else {s.Top++s.data[s.Top] = v}}// 出战
func (s *SNode) Pop() int {if s.IsEmpty() {fmt.Println("栈空")return -1} else {tmp := s.data[s.Top]s.Top--return tmp}
}
func main() {s := NewSNode(5)s.Push(1)s.Push(2)s.Push(3)s.Push(4)fmt.Println(s.Pop())fmt.Println(s.Pop())fmt.Println(s.Pop())fmt.Println(s.IsEmpty())fmt.Println(s.IsFull())
}

2.2 链式栈
type SNode struct {data intNext *SNode
}var Stack *SNode
var PtrToSNode *SNode// 创建一个链式栈
func CreateSNode() *SNode {s := &SNode{data: -1}s.Next = nilreturn s
}// 栈空
func (s *SNode) IsEmpty() bool {return s.Next == nil
}// 入栈
func (s *SNode) Push(val int) {p := &SNode{data: val, Next: s.Next}s.Next = p
}
func (s *SNode) Pop() int {if s.IsEmpty() {fmt.Println("出栈失败")return -1}p := s.Nextvalue := p.datas.Next = p.Nextreturn value}func main() {s := CreateSNode()s.Push(1)s.Push(2)s.Push(3)s.Push(4)s.Push(5)fmt.Println(s.Pop())fmt.Println(s.Pop())fmt.Println(s.IsEmpty())
}

3.队列
在这里插入代码片
3.1 顺序队列
type Queue struct {data []intrear intfront intMaxSize int
}// 生成一个队列
func CreateQueue(size int) *Queue {q := &Queue{data: make([]int, size), rear: 0, front: 0, MaxSize: size}return q
}// 判断队列为空
func (q *Queue) IsEmpty() bool {return q.front == q.rear
}// 判断队列是否满
func (q *Queue) IsFull() bool {return (q.rear+1)%q.MaxSize == q.front
}// 入队
func (q *Queue) Enqueue(value int) {if q.IsFull() {fmt.Println("Queue full")return}q.rear = (q.rear + 1) % q.MaxSizeq.data[q.rear] = value
}// 出对
func (q *Queue) Dequeue() int {if q.IsEmpty() {fmt.Println("Queue empty")return -1}q.front = (q.front + 1) % q.MaxSizereturn q.data[q.front]
}func main() {q := CreateQueue(5)q.Enqueue(1)q.Enqueue(2)q.Enqueue(3)fmt.Println(q.Dequeue())fmt.Println(q.Dequeue())fmt.Println(q.IsEmpty())fmt.Println(q.IsFull())}

3.2 链式队列
type LNode struct {data intnext *LNode
}
type QNode struct {rear *LNodefront *LNodemaxSize int
}func initQueue(maxSize int) *QNode {var q = &QNode{rear: nil,front: nil,maxSize: maxSize,}return q
}// 入队
func (q *QNode) Enqueue(data int) {s := &LNode{data: data, next: nil}if q.IsEmpty() {q.rear = sq.front = sreturn}q.rear.next = sq.rear = s}// 队空
func (q *QNode) IsEmpty() bool {return q.rear == nil
}// 出队
func (q *QNode) DeQueue() int {if q.IsEmpty() {fmt.Println("Queue is empty")return -1}s := q.frontif q.front == q.rear {q.rear = nilq.front = nil} else {q.front = q.front.next}return s.data
}
func main() {s := initQueue(5)s.Enqueue(1)s.Enqueue(2)s.Enqueue(3)fmt.Println(s.DeQueue())fmt.Println(s.DeQueue())fmt.Println(s.IsEmpty())
}

4.树
4.1 遍历造树
package mainimport ("fmt"
)type Node struct {Data byteLChild *NodeRChild *Node
}func postOrder(root *Node) {if root == nil {return}postOrder(root.LChild)postOrder(root.RChild)fmt.Printf("%c", root.Data)}
func Search(num byte, in []byte, lens int) int {for i := 0; i < lens; i++ {if in[i] == num {return i}}return -1
}func msn(pre []byte, in []byte, len int) *Node {if len <= 0 {return nil}index := Search(pre[0], in, len)root := &Node{Data: pre[0], LChild: nil, RChild: nil}root.LChild = msn(pre[1:], in, index)root.RChild = msn(pre[index+1:], in[index+1:], len-index-1)return root
}func main() {pre := []byte{'a', 'b', 'd', 'f', 'e', 'c', 'g', 'h', 'i'}in := []byte{'d', 'b', 'e', 'f', 'a', 'g', 'h', 'c', 'i'}root := msn(pre, in, len(in))postOrder(root)
}
4.2 树打印
package mainimport "fmt"// 遍历树
// 生成一课树
// 确定一颗二叉树
type TNode struct {data intLeft, Right *TNode
}func InorderTraversal(bt *TNode) {if bt != nil {InorderTraversal(bt.Left)fmt.Printf("%d ", bt.data)InorderTraversal(bt.Right)}
}
func PreorderTraversal(bt *TNode) {if bt != nil {fmt.Printf("%d ", bt.data)PreorderTraversal(bt.Left)PreorderTraversal(bt.Right)}}
func PostorderTraversal(bt *TNode) {if bt != nil {PostorderTraversal(bt.Left)PostorderTraversal(bt.Right)fmt.Printf("%d ", bt.data)}
}
func GetHeight(bt *TNode) int {if bt != nil {HL := GetHeight(bt.Left)HR := GetHeight(bt.Right)var h intif HL > HR {h = HL} else {h = HR}return h + 1}return 0
}type Queue struct {data []*TNoderear intfront intMaxSize int
}// 生成一个队列
func CreateQueue(size int) *Queue {q := &Queue{data: make([]*TNode, size), rear: 0, front: 0, MaxSize: size}return q
}// 判断队列为空
func (q *Queue) IsEmpty() bool {return q.front == q.rear
}// 判断队列是否满
func (q *Queue) IsFull() bool {return (q.rear+1)%q.MaxSize == q.front
}// 入队
func (q *Queue) Enqueue(value *TNode) {if q.IsFull() {fmt.Println("Queue full")return}q.rear = (q.rear + 1) % q.MaxSizeq.data[q.rear] = value
}// 出对
func (q *Queue) Dequeue() *TNode {if q.IsEmpty() {fmt.Println("Queue empty")return nil}q.front = (q.front + 1) % q.MaxSizereturn q.data[q.front]
}
func LevelOrder(root *TNode) {q := CreateQueue(6)q.Enqueue(root)for !q.IsEmpty() {dequeue := q.Dequeue()fmt.Printf("%d ", dequeue.data)if dequeue.Left != nil {q.Enqueue(dequeue.Left)}if dequeue.Right != nil {q.Enqueue(dequeue.Right)}}
}type SNode struct {data []*TNodeTop intMaxSize int
}var Stack *SNode
var PtrToStack *SNodefunc NewSNode(MaxSize int) *SNode {return &SNode{data: make([]*TNode, MaxSize), Top: -1, MaxSize: MaxSize}
}// 判断堆栈是否空
func (s *SNode) IsEmpty() bool {return s.Top == -1
}// 判断堆栈是否为满
func (s *SNode) IsFull() bool {return s.Top == s.MaxSize-1
}// 压入堆栈
func (s *SNode) Push(v *TNode) {if s.IsFull() {fmt.Println("栈满")return} else {s.Top++s.data[s.Top] = v}}// 出战
func (s *SNode) Pop() *TNode {if s.IsEmpty() {fmt.Println("栈空")return nil} else {tmp := s.data[s.Top]s.Top--return tmp}
}func InOrderTraversalV2(BT *TNode) {T := BTs := NewSNode(6)for T != nil || !s.IsEmpty() {for T != nil {s.Push(T)T = T.Left}if !s.IsEmpty() {T = s.Pop()fmt.Printf("%d ", T.data)T = T.Right}}
}func PreOrderTraverSalV2(BT *TNode) {T := BTs := NewSNode(6)for T != nil || !s.IsEmpty() {for T != nil {fmt.Printf("%d ", T.data)s.Push(T)T = T.Left}if !s.IsEmpty() {T = s.Pop()T = T.Right}}
}
func PrintLevel(bt *TNode) {if bt != nil {if bt.Left == nil && bt.Right == nil {fmt.Printf("%d ", bt.data)}PrintLevel(bt.Left)PrintLevel(bt.Right)}
}
func main() {fmt.Println("hello world")BtRoot := TNode{data: 1, Left: nil, Right: nil}Bt1 := TNode{data: 2, Left: nil, Right: nil}Bt2 := TNode{data: 3, Left: nil, Right: nil}Bt3 := TNode{data: 4, Left: nil, Right: nil}Bt4 := TNode{data: 5, Left: nil, Right: nil}BtRoot.Left = &Bt1BtRoot.Right = &Bt2Bt2.Left = &Bt3Bt2.Right = &Bt4PreorderTraversal(&BtRoot)fmt.Println("")InorderTraversal(&BtRoot)fmt.Println("")////PostorderTraversal(&BtRoot)//fmt.Println("")//fmt.Println(GetHeight(&BtRoot))//fmt.Println("-----------")//LevelOrder(&BtRoot)fmt.Println("")PreOrderTraverSalV2(&BtRoot)fmt.Println("")InOrderTraversalV2(&BtRoot)fmt.Println("")PrintLevel(&BtRoot)
}

5.排序
5.1 冒泡/ 选择/插入/堆排序
func BubbleSort(arr []int) []int {for i := 0; i < len(arr)-1; i++ {for j := 0; j < len(arr)-i-1; j++ {if arr[j] > arr[j+1] {arr[j], arr[j+1] = arr[j+1], arr[j]}}}return arr
}
func InsertSort(arr []int) []int {i := 0for p := 1; p < len(arr); p++ {temp := arr[p]for i = p; i > 0 && arr[i-1] > temp; i-- {arr[i] = arr[i-1]}arr[i] = temp}return arr
}func SelectSort(arr []int) []int {for i := 0; i < len(arr); i++ {minValue := ifor j := i + 1; j < len(arr); j++ {if arr[minValue] > arr[j] {minValue = j}}arr[i], arr[minValue] = arr[minValue], arr[i]}return arr
}func PercDown(arr []int, p int, n int) {var child intvar parent intx := arr[p]for parent = p; parent*2+1 < n; parent = child {child = parent*2 + 1if child != n-1 && arr[child] < arr[child+1] {child++}if x >= arr[child] {break} else {arr[parent] = arr[child]}}arr[parent] = x
}
func HeapSort(arr []int, n int) {i := -1for i = n / 2; i >= 0; i-- {PercDown(arr, i, n)}for i = n - 1; i >= 0; i-- {arr[0], arr[i] = arr[i], arr[0]PercDown(arr, 0, i)}
}func main() {s := []int{1, 8, 3, 2}fmt.Println(s)//s = BubbleSort(s)//fmt.Println(s)//s = InsertSort(s)//fmt.Println(s)//s = SelectSort(s)//fmt.Println(s)//HeapSort(s, len(s))fmt.Println(s)
5.2 快速/归并排序
package mainimport "fmt"func Merge(arr []int, tmpA []int, L int, R int, RightEnd int) {LeftEnd := R - 1Tmp := LNumElements := RightEnd - L + 1for L <= LeftEnd && R <= RightEnd {if arr[L] <= arr[R] {tmpA[Tmp] = arr[L]Tmp++L++} else {tmpA[Tmp] = arr[R]Tmp++R++}}for L <= LeftEnd {tmpA[Tmp] = arr[L]L++Tmp++}for R <= RightEnd {tmpA[Tmp] = arr[R]R++Tmp++}for i := 0; i < NumElements; i++ {arr[RightEnd] = tmpA[RightEnd]RightEnd--}
}func MSort(arr []int, tmpA []int, L int, RightEnd int) {var Center intif L < RightEnd {Center = (L + RightEnd) / 2MSort(arr, tmpA, L, Center)MSort(arr, tmpA, Center+1, RightEnd)Merge(arr, tmpA, L, Center+1, RightEnd)}
}
func MergeSort(arr []int, n int) {tmpA := make([]int, n)MSort(arr, tmpA, 0, n-1)
}
func main() {a := []int{1, 8, 2, 4, 6, 5}fmt.Println(a)MergeSort(a, len(a))fmt.Println(a)
}//Merge非地柜版本
func Merge(A []int, tmpA []int, L int, R int, RightEnd int) {LeftEnd := R - 1Tmp := LNumElements := RightEnd - L + 1for L <= LeftEnd && R <= RightEnd {if A[L] <= A[R] {tmpA[Tmp] = A[L]Tmp++L++} else {tmpA[Tmp] = A[R]Tmp++R++}}for L <= LeftEnd {tmpA[Tmp] = A[L]Tmp++L++}for R <= RightEnd {tmpA[Tmp] = A[R]Tmp++R++}for i := 0; i < NumElements; i++ {A[RightEnd] = tmpA[RightEnd]RightEnd--}
}
func MergePass(A []int, tmpA []int, N int, length int) {var i intvar j intfor i = 0; i <= N-2*length; i += 2 * length {Merge(A, tmpA, i, i+length, i+length*2-1)}if i+length < N {Merge(A, tmpA, i, i+length, N-1)} else {for j = i; j < N; j++ {tmpA[j] = A[j]}}
}func MergeSort(A []int, N int) {length := 1tmpA := make([]int, N)for length < N {MergePass(A, tmpA, N, length)length *= 2MergePass(tmpA, A, N, length)length *= 2}
}
func main() {a := []int{1, 8, 3, 2}fmt.Println(a)MergeSort(a, len(a))fmt.Println(a)
}func InsertionSort(A []int, N int) {for P := 1; P < N; P++ {tmp := A[P]i := Pfor ; i > 0 && A[i-1] > tmp; i-- {A[i] = A[i-1]}A[i] = tmp}
}func Median(A []int, Left int, Right int) int {Center := (Left + Right) / 2if A[Left] > A[Center] {A[Left], A[Center] = A[Center], A[Left]}if A[Left] > A[Right] {A[Right], A[Left] = A[Right], A[Left]}if A[Center] > A[Right] {A[Center], A[Right] = A[Center], A[Center]}A[Center], A[Right-1] = A[Right-1], A[Center]return A[Right-1]
}// 快速排序
func QSort(A []int, left int, right int) {CutOff := 10if right-left > CutOff {Privot := Median(A, left, right)Low := leftHigh := right - 1for {for Low++; A[Low] < Privot; Low++ {}for High--; A[High] > Privot; High-- {}if Low < High {A[Low], A[High] = A[High], A[Low]} else {break}}A[Low], A[right-1] = A[right-1], A[Low]QSort(A, left, Low-1)QSort(A, Low+1, right)} else {InsertionSort(A[left:], right-left+1)}
}
func QuickSort(data []int, N int) {QSort(data, 0, N-1)
}
func main() {arr := []int{1, 8, 3, 2}fmt.Println(arr)QuickSort(arr, len(arr))fmt.Println(arr)
}

相关文章:
go数据结构学习笔记
本博文较为完整的实现了go的链表、栈,队列,树,排序,链表包括顺序链表,双向链表,循环链表,队列是循环队列,排序包含冒牌、选择 1.链表 1.1 顺序链表 type LNode struct {data intn…...
【后端开发】系统设计101——Devops,Git与CICD,云服务与云原生,Linux,安全性,案例研究(30张图详解)
【后端开发】系统设计101——Devops,Git与CICD,云服务与云原生,Linux,安全性,案例研究(30张图详解) 文章目录 1、DevopsDevOps与SRE与平台工程的区别是什么?什么是k8s(Ku…...
Google地图瓦片爬虫——进阶版
紧接上一篇——Google地图瓦片爬虫 clash节点自动切换 为了防止一个IP地址访问频率过快问题,自动切换clash的节点 def change_node(is_stop):while True:_r requests.get("http://127.0.0.1:11053/proxies", headersclash_headers, verifyFalse)# 这里…...
免费windows pdf编辑工具
Epdf(完全免费) 作者:不染心 时间:2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器,目前仍在开发中。它提供了一系列实用的命令行选项,方便用户对 PDF …...
解锁C#数据校验:从基础到实战的进阶之路
一、引言:数据校验为何如此重要? 在软件开发的广袤领域中,数据校验宛如一座坚固的堡垒,守护着系统的稳定与安全。它是确保数据质量的关键防线,能有效避免错误数据的流入,进而提升系统的整体性能和可靠性。…...
Redis的通用命令
⭐️前言⭐️ 本文主要介绍Redis的通用命令 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码及博主日常练习代码均已上传GitHub 📍内容导…...
设计模式六大原则和单例模式
设计模式 目的 实现可重用解决方案,构筑易维护、可扩展的软件系统。 六大原则 单一职责: 类的职责单一,一个方法做一件事。 开闭原则: 拓展开放,修改关闭。 里氏替换: 父类能出现的地方,子…...
Redis性能优化
1.是否使用复杂度过高的命令 首先,第一步,你需要去查看一下 Redis 的慢日志(slowlog)。 Redis 提供了慢日志命令的统计功能,它记录了有哪些命令在执行时耗时比较久。 查看 Redis 慢日志之前,你需要设置慢…...
SAM 大模型杂谈
目录 1. 前言 2. 发展历程 3. SAM 大模型的技术架构 3.1 模型结构 3.2 训练方法 3.3 数据处理 4. SAM 大模型的应用领域 4.1 自然语言处理 4.2 计算机视觉 4.3 多模态学习 4.4 其他领域 5. SAM 大模型的优势与挑战 5.1 优势 5.2 挑战 6. SAM 大模型的未来发展方…...
openGauss 3.0 数据库在线实训课程2:学习客户端工具gsql的使用
openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见:openGauss 3.0.0数据库在线实训课程 学习目标 学习openGauss数据库客户端工具gsql的使用。 课程作业 gsql是openGauss提供在命令行下运行的数据库连接工具&am…...
B站自研的第二代视频连麦系统(上)
导读 本系列文章将从客户端、服务器以及音视频编码优化三个层面,介绍如何基于WebRTC构建视频连麦系统。希望通过这一系列的讲解,帮助开发者更全面地了解 WebRTC 的核心技术与实践应用。 背景 在文章《B站在实时音视频技术领域的探索与实践》中ÿ…...
【远程控制】安装虚拟显示器
todesk远程发现没显示器的机器有问题 电脑如果不外接一个显示器那么会默认为1024 768 分辨率需要安装虚拟显示器参考 竟然是一个隐私屏幕的解决方案。 虚拟显示器 Parsec-vdd 项目地址 Parsec-vdd 最大的优点是:支持 4K 高刷、可添加多个虚拟屏、 H-Cursor&#…...
基于HAI部署DeepSeekR1的招标文书智能辅助生产开发与应用
一、前言 1.1行业背景 在日常商业活动中,招投标流程往往是企业竞标和项目落地的关键一环。其中,招标文书的编写工作对于投标企业极具挑战:既要保证逻辑清晰、条理分明,又必须遵循招标机构的各类格式规范,甚至还有特定…...
解决whisper 本地运行时GPU 利用率不高的问题
我在windows 环境下本地运行whisper 模型,使用的是nivdia RTX4070 显卡,结果发现GPU 的利用率只有2% 。使用 import torch print(torch.cuda.is_available()) 返回TRUE。表示我的cuda 是可用的。 最后在github 的下列网页上找到了问题 极低的 GPU 利…...
模拟实战-用CompletableFuture优化远程RPC调用
实战场景 这是广州某500-900人互联网厂的面试原题 手写并发优化解决思路 我们要调用对方的RPC接口,我们的RPC接口每调用一次对方都会阻塞50ms 但是我们的业务要批量调用RPC,例如我们要批量调用1k次,我们不可能在for循环里面写1k次远程调用…...
深入解析:Jsoup 库的多功能应用场景
Jsoup 是一个强大的 Java 库,主要用于解析和操作 HTML 文档。它不仅广泛应用于网络爬虫和数据抓取,还在网页内容分析、数据清洗与处理、自动化测试等多个领域有着广泛的应用。本文将详细介绍 Jsoup 库的多种用途,并提供具体的代码示例。 一、…...
Polardb三节点集群部署安装--附虚拟机
1. 架构 PolarDB-X 采用 Shared-nothing 与存储计算分离架构进行设计,系统由4个核心组件组成。 计算节点(CN, Compute Node) 计算节点是系统的入口,采用无状态设计,包括 SQL 解析器、优化器、执行器等模块。负责数据…...
Redis - 全局ID生成器 RedisIdWorker
文章目录 Redis - 全局ID生成器 RedisIdWorker一、引言二、实现原理三、代码实现代码说明 四、使用示例示例说明 五、总结 Redis - 全局ID生成器 RedisIdWorker 一、引言 在分布式系统中,生成全局唯一ID是一个常见的需求。传统的自增ID生成方式在分布式环境下容易出…...
【Vitest】单元测试
文章目录 测试:Vitest一、安装二、断言三、回调测试四、对象方法五、模拟第三库 测试:Vitest 一、安装 npm install vitest创建文件:example.test.ts 运行测试: npx vitest example二、断言 import { expect, test } from vi…...
达梦数据库从单主模式转换为主备模式
目录标题 达梦数据库单主转主备配置笔记前期准备服务器环境数据库安装磁盘空间 流程流程图说明基于脱机备份方式的单实例转主备流程图详细步骤说明 详细步骤1. 检查主库归档模式2. 配置主库配置文件dm.ini 文件dmmal.ini 文件dmarch.ini 文件 3. 备份主库数据库4. 备库配置新建…...
爱普生SG-8201CJ石英可编程振荡器:精准频率控制,高效能工业级应用首选
引言在电子设计中,晶振是不可或缺的元器件,它为整个系统提供精准的时间基准。然而,面对市场上琳琅满目的晶振产品,工程师们常常感到选型困难,特别是在需要高精度、高稳定性和快速交付的情况下。今天,我们就…...
5分钟快速搭建零配置静态服务器:http-server终极完整指南
5分钟快速搭建零配置静态服务器:http-server终极完整指南 【免费下载链接】http-server A simple, zero-configuration, command-line http server 项目地址: https://gitcode.com/gh_mirrors/ht/http-server 你是否曾在本地开发时,为了预览一个简…...
终极指南:如何一键激活Cursor Pro完整功能,免费使用AI编程助手
终极指南:如何一键激活Cursor Pro完整功能,免费使用AI编程助手 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: You…...
AI商品计划:中国鞋服零售如何用机器学习解决库存与周转难题
过去十年,中国鞋服零售经历了从线下到线上、从粗放铺货到精准运营的剧烈转变。但一个老问题始终没变:该备多少货,备在哪,备什么颜色尺码。备多了,资金压在仓库,季末折扣吞噬利润;备少了…...
CefFlashBrowser:终极Flash浏览器解决方案的技术实现与实战指南
CefFlashBrowser:终极Flash浏览器解决方案的技术实现与实战指南 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 在Adobe Flash Player正式退役后,无数经典Flash内容…...
从CTF逆向到软件分析:用z3-solver自动化求解约束方程
1. 为什么我们需要z3-solver? 第一次参加CTF比赛时,我遇到一道逆向题,需要解一个包含30多个变量的方程组。当时我花了整整两天时间手工计算,最后还是没能解出来。赛后才知道,原来可以用z3-solver在几分钟内自动求解。这…...
免费跨平台绘图神器:draw.io桌面版终极使用指南
免费跨平台绘图神器:draw.io桌面版终极使用指南 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 还在为不同系统间的图表文件兼容性而烦恼吗?ᾑ…...
解密工业通信调试:Wu.CommTool深度解析与实战指南
解密工业通信调试:Wu.CommTool深度解析与实战指南 【免费下载链接】Wu.CommTool 基于C#、WPF、Prism、MaterialDesign、HandyControl开发的通讯调试工具。支持Modbus Rtu调试、Mqtt调试、TCP调试、串口调试、UDP调试 项目地址: https://gitcode.com/gh_mirrors/wu…...
BepInEx插件框架:为什么它是Unity游戏Mod开发的终极解决方案?
BepInEx插件框架:为什么它是Unity游戏Mod开发的终极解决方案? 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 你是否曾经想过为喜欢的Unity游戏添加新功能&…...
153.YOLOv8 从数据集下载到 ONNX 部署
摘要 目标检测是计算机视觉领域的核心任务之一,YOLO系列算法凭借其单阶段检测架构和实时推理能力,成为工业界部署的首选方案。本文从零开始,系统讲解YOLOv8的完整使用流程,涵盖环境搭建、数据集构建、模型训练、评估与部署全链路。所有代码均基于Ultralytics官方库,提供可…...
