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)
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13478.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习--python基础库之Matplotlib (1) 超级详细!!!

机器学习--python基础库Matplotlib 机器学习--python基础库Matplotlib0 介绍1 实现基础绘图-某城市温度变化图1.1绘制基本图像1.2实现一些其他功能 2 再一个坐标系中绘制多个图像3 多个坐标系显示-plt.subplots(面向对象的画图方法)4 折线图的应用场景 机器学习–python基础库M…

Java 23新特性

文章目录 Java 23新特性一、引言二、Markdown文档注释&#xff08;JEP 467&#xff09;示例 三、ZGC&#xff1a;默认的分代模式&#xff08;JEP 474&#xff09;1. 为什么要引入分代模式2. 使用分代模式的优势3. 如何启用分代模式 四、隐式声明的类和实例主方法&#xff08;JE…

【redis】数据类型之string

字符串类型是Redis最基础的数据结构。首先key都是字符串类型&#xff0c;而且其他几种数据结构都是在字符串类型基础上构建的&#xff0c;所以字符串类型能为其他四种数据结构的学习打下基础。 字符串类型的值实际可以是字符串&#xff08;简单的字符串、复杂的字符串&#xf…

前部分知识复习05

一、多级渐远贴图MipMap 选择贴图&#xff0c;可以勾选贴图的多级渐远效果 [IntRange]_MipMap("MipMap",Range(0,12))0 //多级渐远贴图的LOD调节滑杆 _MipMapTexture("MipMapTexture",2D)"white"{} //定义多级渐远贴图 多级渐远贴图的采样…

[高等数学]曲率

一、知识点 &#xff08;一&#xff09;弧微分 设函数 f ( x ) f(x) f(x) 在区间 ( a , b ) (a,b) (a,b) 内具有连续导数。 在曲线 y f ( x ) yf(x) yf(x) 上取固定点 M 0 ( x 0 , y 0 ) M_0(x_0,y_0) M0​(x0​,y0​) 作为度量弧长的基点&#xff0c;并规定依 x x x 增…

openGauss 3.0 数据库在线实训课程2:学习客户端工具gsql的使用

openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见&#xff1a;openGauss 3.0.0数据库在线实训课程 学习目标 学习openGauss数据库客户端工具gsql的使用。 课程作业 gsql是openGauss提供在命令行下运行的数据库连接工具&am…

模拟实现string类

目录 一.构造与析构函数 二.基础小功能的实现 1.clear 2.c_str 3外部对私有的查看 三.实现string的迭代器 四.string的增删查改 1.push_back尾插 1.1reserve扩容 1.2尾插 3.运算符重载 4.insert在任意位置插入 5.erase删除 5.1npos的处理 5.2函数的实现 6.find查…

机器学习之数学基础:线性代数、微积分、概率论 | PyTorch 深度学习实战

前一篇文章&#xff0c;使用线性回归模型逼近目标模型 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 线性代数、微积分、概率论 …

记录一下 在Mac下用pyinstallter 打包 Django项目

安装: pip install pyinstaller 在urls.py from SheepMasterOneToOne import settings from django.conf.urls.static import staticurlpatterns [path("admin/", admin.site.urls),path(generate_report/export/, ReportAdmin(models.Report, admin.site).generat…

UE求职Demo开发日志#23 线性任务系统数据层实现

1 按上期设计创建数据结构&#xff08;做了一些修改&#xff09; USTRUCT(BlueprintType) struct ARPG_CPLUS_API FQuestNode {GENERATED_USTRUCT_BODY()// 记录前置节点IDUPROPERTY(EditAnywhere, BlueprintReadWrite,Category"QuestNode")TArray<int> Prede…

mysql8安装时提示-缺少Microsoft Visual C++ 2019 x64 redistributable

MySQL8.0安装包mysql-8.0.1-winx64进行安装&#xff0c;提示&#xff1a;This application requires Visual Studio 2019 x64Redistributable, Please install the Redistributable then runthis installer again。出现这个错误是因为我们电脑缺少Microsoft Visual C 这个程序&…

K8s 分布式存储后端(K8s Distributed Storage Backend)

K8s 分布式存储后端 在 K8s 中实现分布式存储后端对于管理跨集群的持久数据、确保高可用性、可扩展性和可靠性至关重要。在 K8s 环境中&#xff0c;应用程序通常被容器化并跨多个节点部署。虽然 K8s 可以有效处理无状态应用程序&#xff0c;但有状态应用程序需要持久存储来维护…

生产环境超实用shell脚本一

生产环境超实用shell脚本一 Shell脚本作为一种强大的自动化工具&#xff0c;能够帮助运维人员轻松应对各种复杂的任务。 本文将为您介绍服务器健康检查、日志清理、备份以及监控等多个方面&#xff0c;并详细阐述每个脚本的功能和应用场景&#xff0c;助力您提升运维效率&…

IM 即时通讯系统-46-OpenIM 提供了专为开发者设计的开源即时通讯解决方案

IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术&#xff0c;提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…

spy-debugger + Charles 调试移动端/内嵌小程序H5

简介说明&#xff1a; PC端可以用F12进行console等进行调试&#xff0c;但移动端App中使用webview就无法进行实时调试&#xff0c;针对这种情况 1. 安装 全局安装 spy-debugger sudo npm install spy-debugger -g // window不用加sudo2. spy-debugger 证书 其实spy-debugg…

深度整理总结MySQL——SQL的执行顺序和流程

SQL的执行顺序和流程 SQL的执行顺序执行一条select语句,发生了什么呢连接器查询缓存解析SQL执行SQL预处理器优化器执行器 总结 SQL的执行顺序 这是一条标准的查询语句: 但实际上并不是从上到下去解析的,真实的执行顺序是: 我们先执行from,join来确定表之间的连接关系&#x…

使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南

文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;的应用逐渐成为技术热点&#xff0c;而 DeepSeek 作为国产开…

Redis有哪些常用应用场景?

大家好&#xff0c;我是锋哥。今天分享关于【Redis有哪些常用应用场景?】面试题。希望对大家有帮助&#xff1b; Redis有哪些常用应用场景? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 是一个高性能的键值对存储数据库&#xff0c;它有许多应用场景&…

115,【7】 攻防世界 web fileinclude

进入靶场 试着访问了几个文件&#xff0c;都没得到信息&#xff0c;f12看看源码 还真有 <?php // 检查是否开启了错误显示功能 // ini_get 函数用于获取 PHP 配置选项的值&#xff0c;这里检查 display_errors 选项是否开启 if( !ini_get(display_errors) ) {// 如果错误…

SpringBoot开发(五)SpringBoot接收请求参数

1. SpringBoot接收请求参数 1.1. 获取参数的方式 &#xff08;1&#xff09;通过request对象获取参数   &#xff08;2&#xff09;RequestParam(针对请求头方式为x-www-form-ur lencoded)   &#xff08;3&#xff09;RequestBody(针对请求头方式为application/json)   …