Go语言之路————数组、切片、map
Go语言之路————数组、切片、map
- 前言
- 一、数组
- 二、切片
- 三、map
前言
- 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go,到后面能正常完成工作上的业务开发的过程,如果你也是个小白或者转Go语言的,希望我这篇文章对你有所帮助。
- 有关go其他基础的内容的文章大家可以查看我的主页,接下来主要就是把这个系列更完,更完之后我会在每篇文章中挂上连接,方便大家跳转和复习。
在java中,大家最常用的就是list和map,而在go中,最常用的就是切片和map,下面我就一一介绍一下它们的用法。
一、数组
-
用var定义一个数组,var后面跟数组名字,后面中括号代表数组容量(容量一定要是常量),最后面代表数组值的数据类型
var array [5]int
-
初始化数组
其实在第一步中,我们用var声明的时候,已经相当于初始化了数组,这样声明出来的数组,里面数据全是0,容量为5
我们还可以用值等的方式去初始化:func main() {array := [5]int{1, 2, 3, 4, 5}fmt.Println(array) } //输出:[1 2 3 4 5]
-
获取数组长度 、容量
获取长度,我们需要用到len函数,容量需要用到cap函数,不过数组的长度和容量相等的,容量对切片才有意义。fmt.Println(len(array)) fmt.Println(cap(array)) //输出:5
-
根据下标操作元素
func main() {array := [5]int{1, 2, 3, 4, 5}fmt.Println(array[1])array[1] = 11fmt.Println(array[1]) }
-
遍历
数组的遍历,和下面切片的遍历,都可以用上篇文章我们讲的for range来实现func main() {array := [5]int{1, 2, 3, 4, 5}for _, value := range array {fmt.Println(value)} }
-
数组的切割
数组可以根据下标去切割,区间为左闭右开,切割后,就变成了切片func main() {array := [5]int{1, 2, 3, 4, 5}array1 := array[1:3]fmt.Println(array1) } //输出:[2 3]
上面示例中,经过我们切割后的array1,就是一个切片,我们来打印一下数据类型:
fmt.Printf("%T", array) fmt.Printf("%T", array1) //输出:[5]int []int
[5]int是一个数组,[]int是一个切片
要注意,这时候的切片array1和数组array指向的是同一片内存,我们修改切片中的内容,也会修改到数组中的值,看代码:func main() {array := [5]int{1, 2, 3, 4, 5}slice := array[1:3]fmt.Println(array[1])slice[0] = 88fmt.Println(array[1]) } //输出: 2 88
如果我们要对切片做更改怎么办,可以用slices的Clone函数,我们拷贝一个新的切片出来,避免修改到同一个内存中的数据
func main() {array := [5]int{1, 2, 3, 4, 5}array1 := array[1:3]clone := slices.Clone(array1)clone[0] = 88fmt.Println(array[1]) } //输出:2
数组是值类型,并且不能扩容
二、切片
定义:和数组几乎一模一样,但是又有着很明显的区别,那就是切片可以动态扩展,而数组当你定义好长度后,就不能动态去扩展了。而且数组是值类型,切片是引用类型,切片的底层实现依旧是数组,可以简单理解为是指向底层数组的指针。切片我们在实际开发中用的最多,所以我们就详细来讲一下,用法和数组基本一致,会操作切片了,也就会操作数组了。
-
定义一个切片,有如下4几种方法
var slice[]int // 值 slice := []int{1, 2, 3} // 值 slice := make([]int, 0, 0) // 值 slice := new([]int) // 指针
通过上面数组的第六点和现在的代码,我们可以看到切片和数组定义几乎一模一样,只是没有在中括号中去声明数组的长度
-
make函数
通常情况下,我们用make函数来定义一个切片,下面要讲的map也是,都用make函数,make函数接受3个参数,第一个参数代表定义的数据类型,第二个参数代表长度,第三个参数代表的是容量func main() {slice := make([]int, 0, 0) // 值slice2 := make([]int, 4, 40) // 值fmt.Println(len(slice), cap(slice))fmt.Println(len(slice2), cap(slice2)) } //输出: 0 0 4 40
怎么去理解长度和容量呢,长度就是代表着切片当前的数据长度,而容量代表着切片允许最大的数据长度,一旦超过容量,就要进行扩容,就像水库蓄水一样。
-
new关键词
既然这里提到了,就简单说一下,new关键词跟java不一样,不是创建一个新的对象出来,而是创建一个指针,后面会详细说指针。 -
append函数向尾部添加元素
切片的下标读取、修改、for循环遍历等和数组完全一样,这里就不写重复代码了,重点提一下他们的区别,如何动态扩容:append函数
append向末尾添加新元素,并且返回一个切片func main() {slice := make([]int, 0, 0) // 值slice = append(slice, 1)fmt.Println(slice, len(slice), cap(slice)) } //输出:[1] 1 1
我们即使定义一个长度和容量都为0的切片,用append添加一个元素后,会动态扩容为1的切片。这里再简单提一下返回的新切片的扩容策略:在 1.18 版本更新之后,slice 的扩容策略变为了: 当原 slice 容量(oldcap)小于 256 的时候,新 slice(newcap)容量为原来的 2 倍;原 slice 容量超过 256,新 slice 容量 newcap = oldcap+(oldcap+3*256)/4,这个大家了解一下就行了,一般只有面试才能用到。
因为这个扩容机制,所以才会出现长度和容量不一致的情况,这都是正常的内部算法。 -
append插入元素
从头部插入元素func main() {slice := []int{1, 2, 3, 4, 5}slice = append([]int{-1, 0}, slice...)fmt.Println(slice) }
从中间插入元素,比如我们是从下标为3开始插入
func main() {slice := []int{1, 2, 3, 4, 5}slice = append(slice[:3+1], append([]int{999, 999}, slice[3+1:]...)...)fmt.Println(slice) }
尾部插入
尾部插入就是我们上面已经使用过的,直接调用就好,可以支持一次性插入多个func main() {slice := []int{1, 2, 3, 4, 5}slice = append(slice, 6, 7, 8)fmt.Println(slice) }
我们如果仔细去阅读一下头部插入和中间插入的代码,无非就是定义一个新的切片,然后组装老的切片,以实现插入的效果。
-
删除元素
定义以下切片slice := []int{1, 2, 3, 4, 5}
-
删除头部和尾部,直接用上面讲到的数据切割的知识点就行了。
//删除头部2个元素 slice = slice[2:] //删除尾部2个元素 slice = slice[:3] //输出分别为:[3 4 5] 和[1 2 3]
-
从中间指定下标 i 位置开始删除 n 个元素
这个就要借助append函数,本质上还是和插入一样,新切片的组装,这点就是要吐槽的一点,没有官方的api封装,这个使用起来很是麻烦。
slice = append(slice[:i], slice[i+n:]...)
-
-
拷贝
从一个切片拷贝到另一个切片,切记目标切片的长度一定要大于等于源切片func main() {source := []int{1, 2, 3, 4, 5}target := make([]int, 5, 10)copy(target, source)fmt.Println(target) }
就像这个例子,我们定义target的时候,它的长度一定要大于等于5,才能拷贝全,如果我们定义长度为4,那么拷贝后就是[1,2,3,4],5拷贝不进来。
-
遍历
上面讲数组说过了,主要常用两种方式,fori和for range,直接看代码:source := []int{1, 2, 3, 4, 5}for i := 0; i < len(source); i++ {fmt.Println(source[i])}for _, v := range source {fmt.Println(v)}
-
清空数组或者切片
clear函数source := []int{1, 2, 3, 4, 5}clear(source)
-
二维数组或者切片
这里简单提一下,其实和java差不多,只是要结合go来使用
分别定义一个二维的数组和二维切片func main() {aa := [5][5]int{}fmt.Println(aa)bb := make([][]int, 5)fmt.Println(bb) } //输出: [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] [[] [] [] [] []]
通过这里大家也看到了,数组长度是固定的,所以定义出来就是好的,但是切片不一样,所以切片的多维我们要循环单独定义
func main() {bb := make([][]int, 5)for i := range bb {bb[i] = make([]int, 5)}fmt.Println(bb) } //输出: [[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]]
三、map
go中map的术语叫做映射,它和java的map基本一致,都是k,v结构,只是用法有细微的差别,我给你简单举几个例,相信你很快就能掌握它
-
我们先来用var和make函数定义一个映射
//定义一个key是string类型,value是string类型的一个映射 var a map[string]string //定义一个key是string类型,value是int类型的一个映射 a := make(map[string]int, 5)
可以看到,map的语法:map[keyType]valueType{},然后后面跟一个初始容量,默认是0
-
map的添加和读取
map的添加和读取都是通过key索引来做的,就跟数组一样,非常简单func main() {a := make(map[string]int, 5)a["one"] = 1a["two"] = 2fmt.Println(a)i := a["one"]fmt.Println(i) }//输出: map[one:1 two:2] 1
map的访问是有返回的,可以用来判断是否存在exist,如果不存在就返回false和默认值,int默认值是0
func main() {a := make(map[string]int, 5)a["one"] = 1val, exist := a["f"]fmt.Println(exist,val) } //输出:false,0
-
map的删除和清空
使用go的两个内置函数,delete和clearfunc main() {a := make(map[string]int, 5)a["one"] = 1a["two"] = 2delete(a,"one")clear(a) }
-
map的遍历
也是我们的老朋友,for range,range迭代两个参数,一个k一个vfunc main() {a := make(map[string]int, 5)a["one"] = 1a["two"] = 2for k, v := range a {fmt.Println(k, v)} }
map不是并发安全的,go中有sync.Map来做并发安全的map,类似于java的ConcurrentHashmap
好了,以上就是本节全部内容了,下一篇,我们将开始了解go中的指针和结构体的知识点。
相关文章:
Go语言之路————数组、切片、map
Go语言之路————数组、切片、map 前言一、数组二、切片三、map 前言 我是一名多年Java开发人员,因为工作需要现在要学习go语言,Go语言之路是一个系列,记录着我从0开始接触Go,到后面能正常完成工作上的业务开发的过程ÿ…...
Kotlin Bytedeco OpenCV 图像图像57 图像ROI
Kotlin Bytedeco OpenCV 图像图像57 图像ROI 1 添加依赖2 测试代码3 测试结果 1 添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns"http://maven.apache.o…...
字符编码通过字节数组向16进制的互转【终端设备通讯案例篇】:微信小程序 JavaScript字符串转gb2312 字符编码,以16进制字符串传输。(接收蓝牙设备的信息,发送北斗终端消息)
文章目录 引言I 原理II 案例一:微信小程序字符串转gb2312 字符编码,以16进制字符串传输。字节数组 转16进制字符串微信小程序字符串转gb2312 字节数组(utf8ToGb2312Bytes)demo:gb2312 字符编码->字节数组->16进制字符串III 案例二: 小程序接收gb2312 的16进制字符串…...
LabVIEW与WPS文件格式的兼容性
LabVIEW 本身并不原生支持将文件直接保存为 WPS 格式(如 WPS 文档或表格)。然而,可以通过几种间接的方式实现这一目标,确保您能将 LabVIEW 中的数据或报告转换为 WPS 可兼容的格式。以下是几种常见的解决方案: 导出…...
协程(还需要输入3个字)
昨天我偶然听到协程这个概念,不禁好奇地了解了一下,做些笔记如下: 一、什么是协程 协程是在线程内部,由程序自己控制逻辑, 显式地让出控制权(yield)来实现任务切换,而不是由操作系…...
系统架构设计师-第1章-计算机系统知识要点
【本章学习建议】 根据考试大纲,本章主要考查系统架构设计师单选题,预计考1分左右。第二版教材2.2节增加了本块内容,但较为简略,需要课程补充,属于非重点内容。 1.1 计算机硬件组成 计算机的基本硬件系统由运算器、控…...
Linux -- 初识HTTP协议
目录 什么是HTTP协议 什么是 URL ? 理解 URL 初识HTTP 请求与响应格式 代码验证 gitee HTTP.hpp 结果 什么是HTTP协议 HTTP(HyperText Transfer Protocol,超文本传输协议)主要用于客户端(通常是浏览器&#…...
【已解决】我和ollama运行的qwen2.5大模型通信,总是返回GGGG?
起因: 和大模型通信的时候,总是返回 GGG 之类的乱码。 curl查询返回到结果: 既然curl通信不行,直接在控制台聊天呢? 话都说不明白,我火了,结果一查,我熄火了,是ollama…...
在Mac mini上实现本地话部署AI和知识库
在Mac mini上实现本地话部署AI和知识库 硬件要求:大模型AI,也叫LLM,需要硬件支持,常见的方式有2种:一种是采用英伟达之类支持CUDA库的GPU芯片或者专用AI芯片;第二种是采用苹果M系列芯片架构的支持统一内存架…...
SQL和MySQL以及DAX的日期表生成?数字型日期?将生成的日期表插入到临时表或者实体表中
几种生成日期表的方法 如何用SQL语句生成日期表呢? 如何用MySQL语句生成日期表呢? 如何用DAX语句生成日期表呢? 1. MySQL生成日期表 1.1 日期格式:yyyy-MM-dd 字符型 2024-01-02 -- 生成日期表 WITH RECURSIVE temp_dateTable …...
win32汇编环境,窗口程序中基础列表框的应用举例
;运行效果 ;win32汇编环境,窗口程序中基础列表框的应用举例 ;比如在窗口程序中生成列表框,增加子项,删除某项,取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>…...
Sentinel配置流控规则详解
前言 在微服务架构中,流量控制(Flow Control)是保障服务稳定性的重要手段之一。Sentinel作为一款开源的流量控制、熔断降级Java库,以其丰富的应用场景和完善的监控能力,在微服务保护中扮演了重要角色。本文将详细介绍…...
opencv图像基础学习
2.3图像的加密解密 源码如下: import cv2 import numpy as np import matplotlib.pyplot as plt def passImg():imgcv2.imread(./image/cat.jpg,0)h,wimg.shape#生成一个密码,加密key_imgnp.random.randint(0,256,size(h,w),dtypenp.uint8)img_addmcv2…...
递归40题!再见递归
简介:40个问题,有难有易,均使用递归完成,需要C/C的指针、字符串、数组、链表等基础知识作为基础。 1、数字出现的次数 由键盘录入一个正整数,求该整数中每个数字出现的次数。 输入:19931003 输出…...
javadoc使用dos命令生成api文档演示
新建一个文本后缀改java,名字改为类名 文本内容: /** * author ZZJ * version jdk23.0.1 */ public class Test{/*** 求输入两个参数范围以内整数的和* param n 接收的第一个参数,范围起点* param m 接收的第二个参数,范围终点*…...
OpenAI推出首个AI Agent!日常事项自动化处理!
2025 年1月15日,OpenAI 正式宣布推出一项名为Tasks的测试版功能 。 该功能可以根据你的需求内容和时间实现自动化处理。比方说,你可以设置每天早晨 7 点获取天气预报,或定时提醒遛狗等日常事项。 看到这里,有没有一种熟悉的感觉&a…...
uniapp实现“到这儿去”、拨打电话功能
"到这儿去" 在 UniApp 中实现“到这儿去”的功能,即调起地图导航至指定位置,对于不同的平台(小程序、H5、App)有不同的处理方式。下面将简单介绍如何在这些平台上实现该功能,并讨论位置信息的获取。后面需求会用到,先来找一些相关资料,并不一定很准确,但也来…...
T-SQL语言的计算机基础
T-SQL语言的计算机基础 引言 在当今信息技术迅猛发展的时代,数据已成为企业和组织决策的重要基础。而处理和管理数据的工具和语言也日益成为IT专业人员必备的技能之一。T-SQL(Transact-SQL)作为微软SQL Server数据库的扩展,是一…...
SpringBoot + Websocket实现系统用户消息通知
1、引入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.7</version><relativePath/> </parent> <dependencies><dependency>…...
基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day 1
基于 HTML5 Canvas 制作一个精美的 2048 小游戏 在这个快节奏的生活中,简单而富有挑战性的游戏总能给我们带来乐趣。2048 是一款受欢迎的益智游戏,不仅考验智力,还能让人回味无穷。今天,我带领大家将一起学习如何使用 HTML5 Canv…...
macos arm 本地/docker/本地k8s 安装jupyterhub 并登陆
概述 很多文章写的启动官方docker镜像后,新建linux用户即可直接登录,不知道是否版本原因,总之目前最新版我亲测不可以,踩坑两天,这里记录下解决过程,以及各种细节在文档中的位置.以及为什么官方镜像不能直接使用的原因. part1 本地安装jupyterhub https://jupyterhub.readth…...
go采集注册表
package mainimport ("fmt""golang.org/x/sys/windows/registry""log""os""strconv""strings" )func USBSTOR_Enum() {// 打开注册表键keyPath : SYSTEM\CurrentControlSet\Services\USBSTOR\Enumk, err : regist…...
Java连接TDengine和MySQL双数据源
git文件地址:项目首页 - SpringBoot连接TDengine和MySQL双数据源:SpringBoot连接TDengine和MySQL双数据源 - GitCode 1、yml配置 spring:datasource:druid:mysql:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/testusername: roo…...
配置AOSP下载环境
1#curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo 2#repo init -u https://android.googlesource.com/platform/manifest 3#清华镜像站帮助页 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 4#同步安卓AOSP 这里是安卓13 repo init -u htt…...
SpringBoot源码解析(七):应用上下文结构体系
SpringBoot源码系列文章 SpringBoot源码解析(一):SpringApplication构造方法 SpringBoot源码解析(二):引导上下文DefaultBootstrapContext SpringBoot源码解析(三):启动开始阶段 SpringBoot源码解析(四):解析应用参数args Sp…...
5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署
想象一下,只需简单几步操作,就能生成逼真的语音效果,无论是为客户服务还是为游戏角色配音,都能轻松实现。GPT-Sovits 模型,其高效的语音生成能力为实现自然、流畅的语音交互提供了强有力的技术支持。本文将详细介绍如何…...
数字化时代,传统代理模式的变革之路
在数字化飞速发展的今天,线上线下融合(O2O)成了商业领域的大趋势。这股潮流,正猛烈冲击着传统代理模式,给它带来了新的改变。 咱们先看看线上线下融合现在啥情况。线上渠道那是越来越多,企业纷纷在电商平台…...
python爬虫爬取淘宝商品比价||淘宝商品详情API接口
最近在学习北京理工大学的爬虫课程,其中一个实例是讲如何爬取淘宝商品信息,现整理如下: 功能描述:获取淘宝搜索页面的信息,提取其中的商品名称和价格 探讨:淘宝的搜索接口 翻页的处理 技术路线:requests…...
HunyuanVideo 文生视频模型实践
HunyuanVideo 文生视频模型实践 flyfish 运行 HunyuanVideo 模型使用文本生成视频的推荐配置(batch size 1): 模型分辨率(height/width/frame)峰值显存HunyuanVideo720px1280px129f60GHunyuanVideo544px960px129f45G 本项目适用于使用 N…...
CSRF攻击XSS攻击
概述 在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等标签以及 Ajax 都可以指向一个资源地址,而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指…...
vue3学习日记8 - 一级分类
最近发现职场前端用的框架大多为vue,所以最近也跟着黑马程序员vue3的课程进行学习,以下是我的学习记录 视频网址: Day2-17.Layout-Pinia优化重复请求_哔哩哔哩_bilibili 学习日记: vue3学习日记1 - 环境搭建-CSDN博客 vue3学…...
Notepad++移除所有空格
1.打开Notepad。 2.打开你想要编辑的文件。 3.按下 Ctrl H 打开查找和替换对话框,并选择 “正则表达式”。 4.在 “查找目标” 框中输入 \s。 5.在 “替换为” 框中留空,不填写任何内容。 6.点击 “全部替换” 按钮。...
JavaSE第八天
一、继承之super关键字 super关键字: 一个引用变量,用于引用父类对象 父类和子类都具有相同的命名方法,要调用父类方法时使用 父类和子类都具有相同的命名属性,要调用父类中的属性时使用 super也是父类的构造函数,…...
ideal jdk报错如何解决
例如: 可能一:环境变量中未配置 请在Path中加入并将要使用的最好置顶,如 可能二:项目结构中语言级别错误: 可能三:Maven工程中,对于模块要单独设置jdk: 如: 未设置则为默认,在博主本次展示中为:...
嵌入式Linux ntpclient的使用
ntpclient是一个用于与NTP(Network Time Protocol,网络时间协议)服务器通信并测量系统时间的工具。我这里用的是"ntpclient_2024_132"。下载源码编译后会得到一个ntpclient程序。 下面是对ntpclient每个选项的解释: -…...
25/1/15 嵌入式笔记 初学STM32F108
GPIO初始化函数 GPIO_Ini:初始化GPIO引脚的模式,速度和引脚号 GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的引脚0 GPIO输出控制函数 GPIO_SetBits:将指定的GPIO引脚设置为高电平 GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将GPIO…...
【练习】力扣热题100 字符串解码
题目 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,…...
1.快慢指针-力扣-283-移动零
题目描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 用例 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nu…...
5. 使用springboot做一个音乐播放器软件项目【业务逻辑开发】
#万物oop 上一章文章 我们做了音乐播放器 数据表的创建。参加地址: https://blog.csdn.net/Drug_/article/details/145093705 今天分享的这篇文章就是根据数据表 来写 业务逻辑 。 今天我们主要是实现管理后台的功能。 对于这篇文章 的理解 需要小伙伴有 springbo…...
配置正确spring-boot工程启动的时候报错dynamic-datasource Please check the setting of primary
一个两年没有碰的spring-boot工程,启动时报错。因为用了baomidou的多源数据库配置,因此启动时报错primary没有正确配置。经过检查,确定配置文件配置正确。 报错原因是没有读到正确的配置文件。pom文件里的resources标签重定义,把…...
Freeswitch使用media_bug能力实现回铃音检测
利用freeswitch的media bug能力来在智能外呼时通过websocket对接智能中心的声音检测接口,来实现回铃音检测,来判断用户当前是否已响应,拒接,关机等。 1.回铃音处理流程 2.模块源码目录结构 首先新建一个freeswitch的源码的src/a…...
Kubernetes(k8s)和Docker Compose本质区别
Kubernetes(简称 k8s)和 Docker Compose 是容器编排领域的两大重要工具,虽然它们都用于管理和编排容器化应用,但在设计目标、功能特性、使用场景和复杂度上存在显著差异。以下将从多个方面详细探讨 Kubernetes 和 Docker Compose …...
OSI七层协议——分层网络协议
OSI七层协议,顾名思义,分为七层,实际上七层是不存在的,是人为的进行划分,让人更好的理解 七层协议包括,物理层(我),数据链路层(据),网络层(网),传输层(传输),会话层(会),表示层(表),应用层(用)(记忆口诀->我会用表…...
RabbitMQ 客户端 连接、发送、接收处理消息
RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务,不是像其他服务器一样,负责逻辑处理,然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息, 第一步&a…...
SQL ON与WHERE区别
在 MySQL 中,ON 和 WHERE 都用于过滤数据,但它们的使用场景和作用有所不同,尤其是在涉及 JOIN 操作时。下面通过具体的例子来说明它们的区别。 1. ON 的作用 ON 用于指定表之间的连接条件,决定哪些行应该被连接在一起。它在 JOI…...
[创业之路-254]:《华为数字化转型之道》-1-华为是一个由客户需求牵引、高度数字化、高度智能化、由无数个闭环流程组成的价值创造、评估、分配系统。
前言: 华为是一个由客户需求牵引、高度数字化、高度智能化、由无数个闭环流程组成的价值创造、评估、分配系统。华为的流程大到战略,小到日常工作,是由无数个自我调节自我优化的数字化闭环控制流程组成,大闭环套小闭环࿰…...
免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之快速入门教程(一)
哈喽大家好,欢迎来到虚拟化时代君(XNHCYL),收不到通知请将我点击星标!“ 大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…...
异步任务与定时任务
一、异步任务 基于TaskExecutionAutoConfiguration配置类中,注册的ThreadPoolTaskExecutor线程池对象进行异步任务执行。 (一)手动执行异步任务 在yml中配置线程池参数 spring: task:execution:pool:core-size: 5 # 核心线程数max-size: 20 # 最大线…...
大模型WebUI:Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(5)
大模型WebUI:Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(5) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.5 Chatbot的特殊Events11.5.1 各事件总演示11.5.2 详解.undo、.retry、.like和.edit…...
32单片机综合应用案例——基于GPS的车辆追踪器(三)(内附详细代码讲解!!!)
困难不会永远存在,只要你勇于面对,坚持努力,就一定能够战胜一切困难。每一次挑战都是一次成长的机会,不要害怕失败,失败是成功之母。只有经历过失败,你才能更加明白自己的不足,并不断改进自己&a…...