go语言中的strings库

news2025/3/28 22:47:36

strings库

func EqualFold

func EqualFold(s, t string) bool

判断两个utf-8编码字符串(将unicode大写、小写、标题三种格式字符视为相同)是否相同。

func main() {
	fmt.Println(strings.EqualFold("hello", "hello"))  //true
	fmt.Println(strings.EqualFold("hello", "HELLO"))  //true
	fmt.Println(strings.EqualFold("hello", "Hello"))  //true
}

func HasPrefix

func HasPrefix(s, prefix string) bool

判断s是否有前缀字符串prefix。

func main() {
	fmt.Println(strings.HasPrefix("golang", "go"))   // true
	fmt.Println(strings.HasPrefix("golang", "lang")) // false
}

func HasSuffix

func HasSuffix(s, suffix string) bool

判断s是否有后缀字符串suffix。

func main() {
	fmt.Println(strings.HasSuffix("hello.txt", ".txt")) // true
	fmt.Println(strings.HasSuffix("hello.txt", ".jpg")) // false
}

func Contains

func Contains(s, substr string) bool

判断字符串s是否包含子串subs

func main() {
	fmt.Println(strings.Contains("hello world", "world")) // true
	fmt.Println(strings.Contains("golang", "java"))       // false
}

func ContainsRune

func ContainsRune(s string, r rune) bool

判断字符串s是否包含utf-8码值r。

func main() {
	fmt.Println(strings.ContainsRune("你好,世界", '界')) // true
	fmt.Println(strings.ContainsRune("hello", '你')) // false
	fmt.Println(strings.ContainsRune("hello", 'h')) // true
}
//这个是适用于单个Unicode字符检查,而不是子串 
//如果输入多个字符的话,报这个错:Too many characters in the rune literal

func ContainsAny

func ContainsAny(s, chars string) bool

判断字符串s是否包含字符串chars中的任一字符。

func main() {
	fmt.Println(strings.ContainsAny("hello", "aeiou")) // true (包含 'e'、'o')
	fmt.Println(strings.ContainsAny("golang", "xyz"))  // false
}

func Count

func Count(s, sep string) int

返回字符串s中有几个不重复的sep子串。

func main() {
	fmt.Println(strings.Count("banana", "a"))  // 3
	fmt.Println(strings.Count("hello", "l"))   // 2
	fmt.Println(strings.Count("golang", "go")) // 1
    fmt.Println(strings.Count("aaaa", "")) //猜一下这个
}

func Index

func Index(s, sep string) int

子串sep在字符串s中第一次出现的位置,不存在则返回-1。

func main() {
	s := "hello world"
	fmt.Println(strings.Index(s, "world")) // 6
	fmt.Println(strings.Index(s, "go"))    // -1 (找不到返回 -1)
}

func IndexByte

func IndexByte(s string, c byte) int

字符c在s中第一次出现的位置,不存在则返回-1。

func main() {
	s := "hello"
	fmt.Println(strings.IndexByte(s, 'e')) // 1
	fmt.Println(strings.IndexByte(s, 'x')) // -1
}

IndexByte适合查找**ASCII** 字符,因为byte是单字节,无法直接表示多字节的 UTF-8 字符(例如中文)。

如果你要查找英文或单字节字符,可以用这个函数,性能会比 IndexRune 略好。

func IndexRune

func IndexRune(s string, r rune) int

unicode码值r在s中第一次出现的位置,不存在则返回-1。

func main() {
	s := "你好,世界"
	fmt.Println(strings.IndexRune(s, '世')) // 9
	fmt.Println(strings.IndexRune(s, '界')) // 12
	fmt.Println(strings.IndexRune(s, '你')) // 0
	fmt.Println(strings.IndexRune(s, 'x')) // -1
}

对于多字节字符(如中文),IndexRune 可以正确识别并定位索引。

注意索引依旧是以字节为单位计算的。例如 “你好”:

  • '你' 占用 3 个字节,索引从 0~2;
  • '好' 索引从 3~5。
    所以 '好' 的开始索引是 3。

func IndexAny

func IndexAny(s, chars string) int

字符串chars中的任一utf-8码值在s中第一次出现的位置,如果不存在或者chars为空字符串则返回-1。

func main() {
	s := "hello"
	fmt.Println(strings.IndexAny(s, "jker")) // 1 (因为 'e' 出现在索引 1)
	fmt.Println(strings.IndexAny(s, "xyz"))  // -1 (找不到)
	//猜一下下面的
	fmt.Println(strings.IndexAny(s, "loo")) 
	fmt.Println(strings.IndexAny(s, "ollo"))
    fmt.Println(strings.IndexAny(s, "olloe"))
}

一次性查找多个可能的字符,只要匹配到其中一个字符,就返回首次出现的索引。

func IndexFunc

func IndexFunc(s string, f func(rune) bool) int

在字符串 s 中,从左到右遍历,每次取出一个 Unicode 字符 r 并调用 f(r) 判断是否为 true,如果是,则返回该字符在字符串中的索引。若遍历完都不为 true,返回 -1。

func main() {
	s := "123abc"
	// 找到第一个字母的位置
	index := strings.IndexFunc(s, func(r rune) bool {
		return unicode.IsLetter(r)
	})
	fmt.Println(index) // 3 ("a" 的位置)
}

f 是一个判断函数,通常会使用到 unicode 包的判断方法(如 unicode.IsLetterunicode.IsDigitunicode.IsSpace 等)。

适合自定义复杂的匹配条件

func LastIndex

func LastIndex(s, sep string) int

子串sep在字符串s中最后一次出现的位置,不存在则返回-1。

func main() {
	s := "hello world world"
	fmt.Println(strings.LastIndex(s, "world")) // 12
	fmt.Println(strings.LastIndex(s, "go"))    // -1
}

LastIndex 用于反向搜索子串的出现位置。

例如文件路径处理时,需要找最后一个斜杠 / 的位置,可以用 LastIndex 来提取文件名等。

func LastIndexAny

func LastIndexAny(s, chars string) int

在字符串 s 中查找 chars任意一个字符最后一次出现的位置,找不到返回 -1。

func main() {
	s := "hello world"
	fmt.Println(strings.LastIndexAny(s, "o"))  //'0' 7
	//猜一下
	fmt.Println(strings.LastIndexAny(s, "hello")) 
}

func LastIndexFunc

func LastIndexFunc(s string, f func(rune) bool) int

从右往左遍历字符串 s,每次取出一个 Unicode 字符 r,调用 f(r) 判断是否为 true

若是,则返回该字符在字符串中的索引,否则 -1

func main() {
	s := "GoLang 123"
	// 找到最后一个字母
	index := strings.LastIndexFunc(s, func(r rune) bool {
		return unicode.IsLetter(r)
	})
	fmt.Println(index) // 5 ('g' 的索引)
}

func Title

func Title(s string) string

返回字符串 s 的拷贝,其中每个“单词”的首字母都被转换为 Title Case(类似首字母大写)。

  • 注意:“单词” 的定义基于 Unicode 标准,会按照空格或非字母边界来拆分。
func main() {
	s := "her royal highness"
	fmt.Println(strings.Title(s)) // "Her Royal Highness"
}

func ToLower

func ToLower(s string) string

返回将所有字母都转为对应的小写版本的拷贝。

func main() {
	fmt.Println(strings.ToLower("Hello WORLD!")) // "hello world!"
}

func ToUpper

func ToUpper(s string) string

返回将所有字母都转为对应的大写版本的拷贝。

func main() {
	fmt.Println(strings.ToUpper("Hello WORLD!")) // "HELLO WORLD!"
}

func ToTitle

func ToTitle(s string) string

返回将所有字母都转为对应的标题版本的拷贝。

func main() {
	fmt.Println(strings.ToTitle("loud noises")) //LOUD NOISES
	s := "lj dz dž hello"
	fmt.Println(strings.ToUpper(s)) // "LJ DZ DŽ HELLO"
	fmt.Println(strings.ToTitle(s)) // "LJ Dz Dž HELLO"
}

区别于 strings.ToUpper

  • ToTitle 对普通字母的效果等同于 ToUpper
  • 对于某些特殊的 Unicode 字母(如 ljdž),ToTitle 会转换成 Titlecase 而不是 Uppercase

func Repeat

func Repeat(s string, count int) string

返回一个新字符串,由 s 重复 count拼接而成。

func main() {
	fmt.Println(strings.Repeat("ha", 3)) // "hahaha"	
}

func Replace

func Replace(s, old, new string, n int) string

在字符串 s 中,把 old 替换成 new,共替换 n 次,返回新字符串。若 n < 0,则替换所有出现。

package main

import (
	"fmt"
	"strings"
)

func main() {
	s := "hello world world"
	fmt.Println(strings.Replace(s, "world", "Go", 1))  // "hello Go world"
	fmt.Println(strings.Replace(s, "world", "Go", -1)) // "hello Go Go"
    //ReplaceAll(s, old, new string) string
    fmt.Println(strings.ReplaceAll(s, "world", "Go")) //类似于 strings.Replace(s, "world", "Go", -1)
}

func Map

func Map(mapping func(rune) rune, s string) string

对字符串 s 中的每个 Unicode 字符 r 调用 mapping(r),返回映射后的字符,并组成新字符串。

mapping 返回 -1,则会丢弃该字符

func main() {
	s := "Hello 123"
	// 将所有数字去掉
	result := strings.Map(func(r rune) rune {
		if unicode.IsDigit(r) {
			return -1 // -1 表示丢弃这个字符
		}
		return r
	}, s)

	fmt.Println(result) // "Hello "

	//大小写转化
	result = strings.Map(func(r rune) rune {
		return unicode.ToUpper(r)
	}, s)
	fmt.Println(result) //HELLO 123

	str := "Go@lang! is #awesome$"

	// 替换 @, !, #, $ 为 *
	result = strings.Map(func(r rune) rune {
		switch r {
		case '@', '!', '#', '$':
			return '*'
		default:
			return r
		}
	}, str)

	fmt.Println(result) // "Go*lang* is *awesome*"
}

Map 适合对字符串做逐字符的自定义转换或过滤。

func Trim

func Trim(s string, cutset string) string

用于去除字符串两端的指定字符集cutset)中的字符。

func main() {
	s := "   !hello world!   "
	cutset := " !"

	// 去除两端的空格和感叹号
	result := strings.Trim(s, cutset)
	fmt.Println(result) // "hello world"
}

func TrimSpace

func TrimSpace(s string) string

去除字符串 s 开头和结尾的空白字符(包括空格、制表符、换行等)。

func main() {
	s := "  Hello Golang \n "
	fmt.Println(strings.TrimSpace(s)) // "Hello Golang"
}

func TrimFunc

func TrimFunc(s string, f func(rune) bool) string

根据自定义的判定函数(函数类型为 func(rune) bool)去除字符串两端的字符。

func main() {
	s := "123!Hello, Go!?!456"
	// 定义判定函数:如果字符不是字母,则返回 true,表示该字符需要被移除
	trimFunc := func(r rune) bool {
		return !unicode.IsLetter(r)
	}

	// 使用 TrimFunc 去除两端非字母字符
	result := strings.TrimFunc(s, trimFunc)
	fmt.Println(result) // 输出 "Hello, Go!?"

	//去除两端的的数字
	trimFunc = func(r rune) bool {
		return unicode.IsDigit(r)
	}
	result = strings.TrimFunc(s, trimFunc)
	fmt.Println(result) // 输出 "!Hello, Go!?!"

}

func TrimLeft

func TrimLeft(s string, cutset string) string

从字符串 左侧(即开头)开始移除所有出现在 cutset 中的字符,直到遇到第一个不在 cutset 中的字符为止。

仅对字符串开头部分进行处理,中间和结尾的字符不会受影响。

func main() {
	s := "!!!Hello, World!!!"
	cutset := "!"

	// 去除左侧所有感叹号
	leftTrimmed := strings.TrimLeft(s, cutset)
	fmt.Println(leftTrimmed) // 输出: "Hello, World!!!"
}

func TrimLeftFunc

func TrimLeftFunc(s string, f func(rune) bool) string

左侧开始,移除连续满足 f(rune) == true 的字符,直到遇到不满足的字符后停止。

func main() {
	s := "   Hello 123"
	// 移除左侧空白
	result := strings.TrimLeftFunc(s, unicode.IsSpace)
	fmt.Println(result) // "Hello 123"
}

func TrimPrefix

func TrimPrefix(s, prefix string) string

若字符串 sprefix 开头,则去除该前缀并返回剩余部分;否则返回 s 本身。

func main() {
	s := "HelloWorld"
	fmt.Println(strings.TrimPrefix(s, "Hello")) // "World"
	fmt.Println(strings.TrimPrefix(s, "Go"))    // "HelloWorld" (无变化)
}

func TrimRight

func TrimRight(s string, cutset string) string

TrimRight 从字符串 右侧(即结尾)开始移除所有出现在 cutset 中的字符,直到遇到第一个不在 cutset 中的字符为止。

仅对字符串末尾部分进行处理,左侧和中间的字符不会受影响。

func main() {
	s := "!!!Hello, World!!!"
	cutset := "!"
	
	// 去除右侧所有感叹号
	rightTrimmed := strings.TrimRight(s, cutset)
	fmt.Println(rightTrimmed) // 输出: "!!!Hello, World"
}

func TrimRightFunc

func TrimRightFunc(s string, f func(rune) bool) string

右侧开始,移除连续满足 f(rune) == true 的字符,直到遇到不满足的字符后停止。

func main() {
	s := "Hello 123   "
	result := strings.TrimRightFunc(s, unicode.IsSpace)
	fmt.Println(result) // "Hello 123"
}

func TrimSuffix

func TrimSuffix(s, suffix string) string

若字符串 ssuffix 结尾,则去除该后缀并返回剩余部分;否则返回 s 本身。

func main() {
	s := "HelloWorld"
	fmt.Println(strings.TrimSuffix(s, "World")) // "Hello"
	fmt.Println(strings.TrimSuffix(s, "Go"))    // "HelloWorld"
}

func Fields

func Fields(s string) []string

strings.Fields 根据 Unicode 空白字符将字符串分割成多个字段。空白字符包括空格、制表符、换行符等,函数会把连续的空白字符看作一个分隔符。

func main() {
	s := "  hello\tworld\n    Go 语言  "
	fields := strings.Fields(s)
	fmt.Println(fields) // 输出: ["hello" "world" "Go" "语言"]
}

func FieldsFunc

func TrimSuffix(s, suffix string) string

strings.FieldsFunc 根据用户提供的判定函数来分割字符串。这个函数接受一个 rune 参数,并返回 truefalse。当判定函数返回 true 时,该字符被视为分隔符。

// 定义一个函数,将所有非字母和非汉字的字符作为分隔符
func isNotLetter(r rune) bool {
    return !unicode.IsLetter(r) && !unicode.Is(unicode.Han, r)
}

func main() {
    s := "hello,world!欢迎来到-Go语言."
    // 根据自定义规则分割字符串
    fields := strings.FieldsFunc(s, isNotLetter)
    fmt.Println(fields) // 输出: ["hello" "world" "欢迎" "来到" "Go语言"]
}

func Split

func Split(s, sep string) []string

按分隔符 sep 拆分字符串 s,返回 []string

  • sep 为空字符串 "",则将 s单个字符拆分。
  • seps 中不存在,则返回 [s]
func main() {
	s := "a,b,c"
	fmt.Println(strings.Split(s, ",")) // ["a" "b" "c"]
	fmt.Println(strings.Split(s, ""))  //[a , b , c]
}

func SplitN

func SplitN(s, sep string, n int) []string

按分隔符 sep 拆分字符串 s,最多拆分 n 个部分,返回 []string

  • 如果 n > 0,则最多返回 n 个子串。
  • 如果 n < 0,则拆分所有可能的子串
func main() {
	s := "a,b,c,d"
	fmt.Println(strings.SplitN(s, ",", 2))  // ["a" "b,c,d"]
	fmt.Println(strings.SplitN(s, ",", -1)) //[a b c d]
}

func SplitAfter/func SplitAfterN

func SplitAfter(s, sep string) []string
func SplitAfterN(s, sep string, n int) []string

Split / SplitN 类似,但保留分隔符在拆分后的结果里。

func main() {
	s := "a,b,c"
	fmt.Println(strings.SplitAfter(s, ","))     // ["a," "b," "c"]
	fmt.Println(strings.SplitAfterN(s, ",", 2)) // ["a," "b,c"]
}

func Join

func Join(a []string, sep string) string

[]string 用分隔符 sep 拼接成一个字符串。

func main() {
	words := []string{"Go", "is", "awesome"}
	fmt.Println(strings.Join(words, " ")) // "Go is awesome"
}

适用于把切片合并成一行文本,比如生成 CSV 行、命令行参数等。

总结:常见字符串操作的思维导图

  1. 判断/搜索
    • Contains/ContainsRune/ContainsAny:是否包含子串或字符
    • HasPrefix/HasSuffix:是否以某前缀/后缀开头或结尾
    • Index/LastIndex 系列:查找子串或字符的第一次/最后一次出现位置
    • Count:统计子串出现次数
    • EqualFold:忽略大小写判断是否相等
  2. 大小写转换
    • ToLower/ToUpper/ToTitle:将字符串全部转为小写/大写/标题形式
    • Title:对每个单词首字母做大写处理
  3. 替换/映射
    • Replace/ReplaceAll:将子串替换为新字符串
    • Map:对每个字符做自定义转换,返回新字符串(可丢弃字符)
  4. 修剪(Trim)
    • Trim/TrimLeft/TrimRight:去除指定字符集
    • TrimSpace:去除首尾空白字符
    • TrimPrefix/TrimSuffix:仅去除指定前缀/后缀
    • TrimFunc/TrimLeftFunc/TrimRightFunc:用自定义函数判断是否需要修剪
  5. 拆分/拼接
    • Split/SplitN/SplitAfter/SplitAfterN:按分隔符拆分字符串
    • Fields/FieldsFunc:按空白或自定义条件拆分
    • Join:将 []string 用分隔符拼接为一个字符串
  6. 重复
    • Repeat:将字符串重复 n

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【嵌入式硬件】三款DCDC调试笔记

关于开关电源芯片&#xff0c;重点关注输入电源范围、输出电流、最低压降。 1.MP9943: 以MP9943为例&#xff0c;输入电压范围4-36V&#xff0c;输出最大电流3A&#xff0c;最低压降为0.3V 调整FB使正常输出为5.06V 给定6V空载、5V空载、5V带2A负载的情况&#xff1a; 6V带2A…

【FPGA开发】FPGA点亮LED灯(增加按键暂停恢复/复位操作)

目录 一、VScode下载安装 1.1 官网下载 1.2 安装插件 二、LED流水灯点亮 2.1 任务说明 2.2 新建项目 2.3 创建Verilog文件添加至顶层实体 2.4 引脚分配 2.5 选择烧录器 2.6 添加烧录文件&#xff06;下载 2.7 烧录结果 三、增加按键操作 3.1 按键暂停和恢复功能&…

Spring MVC 执行流程:一个请求在 Spring MVC 中是如何执行的?

当用户发送一个 HTTP 向 Spring MVC 应用&#xff0c;该请求在 Spring MVC 的执行流程如下&#xff1a; 当用户向 Spring MVC 发起一个 HTTP 请求&#xff0c;该请求会被 Dispatcher Servlet&#xff08;前端控制器&#xff09;拦截&#xff1b;DispatcherServlet 调用 Handler…

三主热备架构

1.要求 角色主机名软件IP地址用户client192.168.72.90keepalivedvip192.168.72.100masterserverAkeepalived, nginx192.168.72.30backupserverBkeepalived, nginx192.168.72.31backupserverCkeepalived, nginx192.168.72.32webtomcat1tomcat192.168.72.41webtomcat2tomcat192.1…

JavaScript | 爬虫逆向 | 语法基础| 01

一、摘要 实践是最好的导师 二、环境配置 在开始之前&#xff0c;需要确保你的计算机上已经安装了 Node.js。Node.js 是一个开源的、跨平台的 JavaScript 运行时环境&#xff0c;它允许你在服务器端运行 JavaScript 代码。 1. 下载 安装地址&#xff1a;https://nodejs.org…

字节跳动实习生主导开发强化学习算法,助力大语言模型性能突破

目录 禹棋赢的背景与成就 主要成就 DAPO算法的技术细节 算法优势 禹棋赢的研究历程 关键时间节点 字节跳动的“Top Seed人才计划” 计划特点 小编总结 在大模型时代&#xff0c;经验不再是唯一的衡量标准&#xff0c;好奇心、执行力和对新技术的敏锐洞察力成为推动技术…

前后端+数据库的项目实战:hbu迎新网-较复杂(下)javaweb

目录 十一、实现对内容的富文本编辑&#xff08;换行、图片颜色等等样式&#xff09; &#xff08;1&#xff09;下载富文本编辑器&#xff0c;引入资源 &#xff08;2&#xff09;将原项目的内容部分替换为富文本编辑器 1、替换添加页面 2、替换修改页面&#xff08;和添…

Redis、Memcached应用场景对比

环境 Redis官方网站&#xff1a; Redis - The Real-time Data Platform Redis社区版本下载地址&#xff1a;Install Redis | Docs Memcached官方网站&#xff1a;memcached - a distributed memory object caching system Memcached下载地址&#xff1a;memcached - a dis…

【单片机通信技术应用——学习笔记三】液晶屏显示技术,取模软件的应用

一、液晶显示技术简介 1.RGB信号线 RGB是一种色彩模式&#xff0c;是工业界的一种颜色标准&#xff0c;是通过红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;、蓝&#xff08;B&#xff09;三个颜色通道的变化&#xff0c;以及它们相互之间的叠加来得到各式各样的…

MySQL颠覆版系列————MySQL新特性(开启数据库的新纪元)上篇

文章目录 前言一、窗口函数&#xff08;Window Functions&#xff09;1.1 窗口函数概念1.2 常见的窗口函数 二、公用表表达式&#xff08;Common Table Expressions, CTEs&#xff09;2.1 公用表表达式的概念2.2 常见的公用表表达式 三、JSON增强3.1 JSON增强的概念3.2 常见的J…

MySQL 调优:查询慢除了索引还能因为什么?

文章目录 情况一&#xff1a;连接数过小情况二&#xff1a;Buffer Pool 太小 MySQL 查询慢除了索引还能因为什么&#xff1f;MySQL 查询慢&#xff0c;我们一般也会想到是因为索引&#xff0c;但除了索引还有哪些原因会导致数据库查询变慢呢&#xff1f; 以下以 MySQL 中一条 S…

如何在百度搜索上删除与自己名字相关的资料

个人信息的网络足迹如同一张无形的网&#xff0c;将我们与世界的每一个角落紧密相连。然而&#xff0c;当某些与自己名字相关的资料不再希望被公众轻易检索到时&#xff0c;如何在百度搜索中有效“隐身”&#xff0c;成为了一个亟待解决的问题。面对复杂多变的网络环境&#xf…

使用外部事件检测接入 CDH 大数据管理平台告警

CDH 大数据管理平台 CDH&#xff08;Cloudera Distribution Hadoop&#xff09;是一个企业级的大数据平台&#xff0c;由 Cloudera 公司提供&#xff0c;它包含了 Apache Hadoop 生态系统中的多种开源组件&#xff0c;并对其进行了优化和集成&#xff0c;以支持大规模数据存储…

MongoDB(五) - Studio 3T 下载与安装教程

文章目录 前言一、Studio 3T 简介二、下载及安装1. 下载2. 安装 三、使用Studio 3T连接MongoDB 前言 本文旨在全面且深入地为你介绍 Studio 3T。从其丰富的功能特性、跨平台使用的便捷性&#xff0c;到详细的下载安装步骤&#xff0c;以及关键的连接 MongoDB 操作&#xff0c;…

汽车制造MES

一、整体生产工序 整车的车间主要分为4个部分&#xff1a;冲压、焊装、涂装、总装、整车入库 系统架构 二、车间概括 1.冲压车间 2.焊装车间 3.涂装车间 4.总装车间 1.整车装配的部件都要可追溯、数据实时性要求高、涉及分装与总装的协调、物流配送的协调、质量批处理的协调、…

信奥赛CSP-J复赛集训(模拟算法专题)(26):P5412 [YNOI2019] 排队

信奥赛CSP-J复赛集训(模拟算法专题)(26):P5412 [YNOI2019] 排队 题目描述 小明所在的班级要举办一场课外活动,在活动开始之前老师告诉小明:“需要把男女生分成两队,并且每一队都要按照身高从矮到高进行排序”。但是由于小明的马虎,没有把老师的安排转达给同学,导致全…

基于开源模型的微调训练及瘦身打造随身扫描仪方案__用AI把手机变成文字识别小能手

基于开源模型的微调训练及瘦身打造随身扫描仪方案__用AI把手机变成文字识别小能手 一、准备工作&#xff1a;组装你的"数码工具箱" 1. 安装基础工具&#xff08;Python环境&#xff09; 操作步骤&#xff1a; 访问Python官网下载安装包安装时务必勾选Add Python to…

在 Offset Explorer 中配置多节点 Kafka 集群的详细指南

一、是否需要配置 Zookeeper&#xff1f; Kafka 集群的 Zookeeper 依赖性与版本及运行模式相关&#xff1a; Kafka 版本是否需要 Zookeeper说明0.11.x 及更早版本✅ 必须配置Kafka 完全依赖 Zookeeper 管理元数据2.8 及以下版本✅ 必须配置Kafka 依赖外置或内置的 Zookeeper …

STM32基础教程——定时器

前言 TIM定时器&#xff08;Timer&#xff09;:STM32的TIM定时器是一种功能强大的外设模块&#xff0c;通过时基单元&#xff08;包含预分频器、计数器和自动重载寄存器&#xff09;实现精准定时和计数功能。其核心原理是&#xff1a;内部时钟&#xff08;CK_INT&#xff09;或…

深入分析和讲解虚拟化技术原理

随着云计算和大数据技术的飞速发展&#xff0c;虚拟化技术应运而生&#xff0c;成为数据中心和IT基础设施的重要组成部分。本文将深入分析虚拟化的基本原理、主要类型以及在实际应用中的意义。 一、虚拟化技术的定义 虚拟化技术是通过软件将物理硬件资源抽象成虚拟资源的技术&…