当前位置: 首页 > news >正文

Golang基础-5

Go语言基础

介绍

基础

介绍

  • 本文介绍Go语言中切片(slice)(切片声明、切片初始化、切片基础操作、多维切片)等相关知识。

基础

切片
  • 切片(slice)是对数组的一个连续片段的引用,切片是一个引用类型。
  • 切片是长度可变的数组,由三部分组成:
    • 指针:指向的数组元素的地址
    • 长度:元素的数量
    • 容量:切片可容纳多少元素
切片声明
  • 需要指定组成元素的类型,不需要指定存储元素的个数。
  • 声明后,默认初始化为 nil,意思是不存在此切片引用。
package mainimport "fmt"func main() {// 声明一个切片var slice1 []intfmt.Printf("slice1 type: %T, value: %v\n", slice1, slice1)// 自动类型推导slice2 := []int{}fmt.Printf("slice2 type: %T, value: %v\n", slice2, slice2)
}

输出结果
slice1 type: []int, value: []
slice2 type: []int, value: []

切片初始化
  • 切片初始化方式较多,具体如下
package mainimport "fmt"func main() {// 字面量初始化var slice1 []int = []int{1, 2, 3, 4, 5}fmt.Println("slice1: ", slice1, ", cap: ", cap(slice1))// 字面量初始化空切片var slice2 []int = []int{}fmt.Println("slice2: ", slice2, ", cap: ", cap(slice2))// 从数组创建并初始化切片var arr [5]int = [5]int{1, 2, 3, 4, 5}slice3 := arr[0:3]fmt.Println("slice3: ", slice3, ", cap: ", cap(slice3))slice4 := arr[0:2:2]fmt.Println("slice4: ", slice4, ", cap: ", cap(slice4))// 从切片创建并初始化切片slice5 := slice4[:1]fmt.Println("slice5: ", slice5, ", cap: ", cap(slice5))slice6 := slice4[1:]fmt.Println("slice6: ", slice6, ", cap: ", cap(slice6))slice7 := slice4[:]fmt.Println("slice7: ", slice7, ", cap: ", cap(slice7))slice8 := slice4[0:0]fmt.Println("slice8: ", slice8, ", cap: ", cap(slice8))// 指定长度和容量字面量初始化slice9 := []int{0: 20, 4: 60}fmt.Println("slice9: ", slice9, ", cap: ", cap(slice9))// 使用 make 函数初始化slice10 := make([]int, 3)fmt.Println("slice10: ", slice10, ", cap: ", cap(slice10))slice11 := make([]int, 3, 6)fmt.Println("slice11: ", slice11, ", cap: ", cap(slice11))
}

输出结果
slice1: [1 2 3 4 5] , cap: 5
slice2: [] , cap: 0
slice3: [1 2 3] , cap: 5
slice4: [1 2] , cap: 2
slice5: [1] , cap: 2
slice6: [2] , cap: 1
slice7: [1 2] , cap: 2
slice8: [] , cap: 2
slice9: [20 0 0 0 60] , cap: 5
slice10: [0 0 0] , cap: 3
slice11: [0 0 0] , cap: 6

切片基础操作
  • 获取切片长度和容量
package mainimport "fmt"func main() {var slice1 []int = []int{1, 2, 3, 4, 5}fmt.Printf("slice1 len: %v, cap: %v\n", len(slice1), cap(slice1))
}

输出结果
slice1 len: 5, cap: 5

  • 切片的访问和修改(通过索引对切片元素进行访问和修改,元素的索引从左到右依次为:0 ~ n(n为切片长度-1))
  • 切片共享底层数组,任何变化都会导致其它切片及底层共享数组变化
package mainimport "fmt"func main() {// 以数组方式创建切片var arr [5]int = [5]int{1, 2, 3, 4, 5}fmt.Printf("arr : %v\n", arr)var slice1 []int = arr[0:3]fmt.Printf("slice1 : %v\n", slice1)// 索引方式访问fmt.Printf("slice1[0] : %v\n", slice1[0])fmt.Printf("slice1[1] : %v\n", slice1[1])fmt.Printf("slice1[2] : %v\n", slice1[2])// 修改值slice1[0] = 100slice1[2] = 200fmt.Printf("slice1 : %v\n", slice1)fmt.Printf("arr : %v\n", arr)// 切片创建新切片slice2 := slice1[:] fmt.Printf("slice2 : %v\n", slice2)slice2[0] = 150slice2[1] = 230fmt.Printf("slice2 : %v\n", slice2)fmt.Printf("slice1 : %v\n", slice1)fmt.Printf("arr : %v\n", arr)
}

输出结果
arr : [1 2 3 4 5]
slice1 : [1 2 3]
slice1[0] : 1
slice1[1] : 2
slice1[2] : 3
slice1 : [100 2 200]
arr : [100 2 200 4 5]
slice2 : [100 2 200]
slice2 : [150 230 200]
slice1 : [150 230 200]
arr : [150 230 200 4 5]

  • 切片遍历
package mainimport "fmt"func main() {var arr [5]int = [5]int{1, 2, 3, 4, 5}fmt.Printf("arr : %v\n", arr)var slice1 []int = arr[0:3]fmt.Printf("slice1 : %v\n", slice1)// for 循环方式遍历for i := 0; i < len(slice1); i++ {fmt.Println("slice1[", i, "] = ", slice1[i])}fmt.Println("======================")// for-range 方式遍历for i, v := range slice1 {fmt.Println("slice1[", i, "] = ", v)}
}

输出结果
arr : [1 2 3 4 5]
slice1 : [1 2 3]
slice1[ 0 ] = 1
slice1[ 1 ] = 2
slice1[ 2 ] = 3
======================
slice1[ 0 ] = 1
slice1[ 1 ] = 2
slice1[ 2 ] = 3

  • 增加元素,内建函数 append 可以为切片动态添加元素
  • 使用 append 对切片增加元素并返回修改后切片
  • 当长度len在容量cap范围内时只增加长度,容量和底层数组不变;当长度len超过容量cap范围则会新创建底层数组并对容量进行扩容
  • 元素数量小于 1024 时,约按原容量 1 倍增加,元素数量大于 1024 时约按原容量 0.5 倍增加(不同Go版本可能有变化,当前使用Go1.22)
  • 切片头部增加元素会导致切片整体复制操作,效率没有末尾增加元素高
package mainimport "fmt"func main() {var arr [5]int = [5]int{1, 2, 3, 4, 5}fmt.Printf("arr : %v\n", arr)var slice1 []int = arr[0:3]fmt.Printf("slice1 : %v, len: %v, cap: %v\n", slice1, len(slice1), cap(slice1))// 增加元素,末尾增加slice1 = append(slice1, 100, 200, 300)fmt.Printf("slice1 append: %v, len: %v, cap: %v\n", slice1, len(slice1), cap(slice1))// 增加元素,末尾增加slice1 = append(slice1, 1, 2, 3, 4, 5, 6, 7, 8)fmt.Printf("slice1 append: %v, len: %v, cap: %v\n", slice1, len(slice1), cap(slice1))slice2 := []int{0: 100, 1023: 100}fmt.Printf("slice2 len: %v, cap: %v\n", len(slice2), cap(slice2))// 增加超过 1024 个元素,末尾增加slice2 = append(slice2, 1, 2, 3, 4, 5)fmt.Printf("slice2 len: %v, cap: %v\n", len(slice2), cap(slice2))
}

输出结果
arr : [1 2 3 4 5]
slice1 : [1 2 3], len: 3, cap: 5
slice1 append: [1 2 3 100 200 300], len: 6, cap: 10
slice1 append: [1 2 3 100 200 300 1 2 3 4 5 6 7 8], len: 14, cap: 20
slice2 len: 1024, cap: 1024
slice2 len: 1029, cap: 1536

  • 切片复制,使用 copy 函数,复制元素数量为 src 元素数量和 dest 元素数量的最小值
package mainimport "fmt"func main() {var slice1 []int = []int{1, 2, 3}var slice2 []int = []int{100, 200, 300, 400, 500}var slice3 []int = []int{1}// copy slice2的3个元素替换到slice1元素copy(slice1, slice2)fmt.Printf("%v, %v, %v\n", slice1, slice2, slice3)// copy slice3的1个元素替换到slice2的第一个元素copy(slice2, slice3)fmt.Printf("%v, %v, %v\n", slice1, slice2, slice3)// copy slice1的1个元素替换到slice3的第一个元素copy(slice3, slice1)fmt.Printf("%v, %v, %v\n", slice1, slice2, slice3)
}

输出结果
[100 200 300], [100 200 300 400 500], [1]
[100 200 300], [1 200 300 400 500], [1]
[100 200 300], [1 200 300 400 500], [100]

  • 删除元素,清空切片
package mainimport "fmt"func main() {var slice1 []int = []int{1, 2, 3}// 清空切片slice1 = slice1[0:0]fmt.Println("slice1 clear: ", slice1)slice1 = append(slice1, 1, 2, 3, 4, 5, 6)fmt.Println("slice1 append: ", slice1)// 清空切片slice1 = nilfmt.Println("slice1 clear: ", slice1)slice1 = append(slice1, 1, 2, 3, 4, 5, 6)fmt.Println("slice1 append: ", slice1)// 删除切片,删除第一个元素slice1 = slice1[1:]fmt.Println(slice1)// 增加第一个元素(将上一步删除的元素重新添加到原来位置)slice1 = append([]int{1}, slice1...)fmt.Println("slice1 append: ", slice1)// 删除切片,删除末尾元素slice1 = slice1[:len(slice1)-1]fmt.Println(slice1)// 增加末尾的元素slice1 = append(slice1, 6)fmt.Println("slice1 append: ", slice1)// 删除第三个元素slice3 := []int{}slice3 = append(slice3, slice1[0:2]...)slice3 = append(slice3, slice1[3:]...)slice1 = slice3fmt.Println("slice3: ", slice1)
}

输出结果
slice1 clear: []
slice1 append: [1 2 3 4 5 6]
slice1 clear: []
slice1 append: [1 2 3 4 5 6]
[2 3 4 5 6]
slice1 append: [1 2 3 4 5 6]
[1 2 3 4 5]
slice1 append: [1 2 3 4 5 6]
slice3: [1 2 4 5 6]

多维切片
  • 多维切片即切片的元素也可以是切片类型
package mainimport "fmt"func main() {// 二维切片声明且初始化var slice1 [][]int = [][]int{{1, 2, 3}, {4, 5, 66}}fmt.Println("slice1: ", slice1)// 自动类型推导slice2 := [][]int{{1, 2, 3}, {4, 55, 6}}fmt.Println("slice2: ", slice2)// make创建切片slice3 := make([][]int, 2)fmt.Println("slice3: ", slice3)slice4 := make([][]int, 2, 5)fmt.Println("slice4: ", slice4)// 修改与访问slice2[0] = []int{100, 200, 300, 400}slice2[0][2] = 30fmt.Println("slice2: ", slice2)// 切片创建切片fmt.Println("slice3: ", slice2[0:1])// 切片遍历,for 循环for i := 0; i < len(slice2); i++ {for j := 0; j < len(slice2[i]); j++ {fmt.Printf("slice2[%v][%v] = %v\t", i, j, slice2[i][j])}fmt.Println()}// 切片遍历,for-rangefor i, s := range slice2 {for j, v := range s {fmt.Printf("slice2[%v][%v] = %v\t", i, j, v)}fmt.Println()}// 增加元素slice1 = append(slice1, []int{10, 20, 30, 40})fmt.Println("slice1 append: ", slice1)slice1[0] = append(slice1[0], 10, 20, 30, 40)fmt.Println("slice1 append: ", slice1)// 复制元素,src 数量少于 dst 数量时,将 src 对应行替换到 dst对应行,dst 多出行继续显示// src 数量大于 dst 数量时,以 dst 数量为准,将 src 对应行替换到 dst对应行fmt.Println("slice1 copy before: ", slice1)fmt.Println("slice2 copy before: ", slice2)copy(slice1, slice2)fmt.Println("slice1 copy: ", slice1)
}

输出结果
slice1: [[1 2 3] [4 5 66]]
slice2: [[1 2 3] [4 55 6]]
slice3: [[] []]
slice4: [[] []]
slice2: [[100 200 30 400] [4 55 6]]
slice3: [[100 200 30 400]]
slice2[0][0] = 100 slice2[0][1] = 200 slice2[0][2] = > 30 slice2[0][3] = 400
slice2[1][0] = 4 slice2[1][1] = 55 slice2[1][2] = 6
slice2[0][0] = 100 slice2[0][1] = 200 slice2[0][2] = > 30 slice2[0][3] = 400
slice2[1][0] = 4 slice2[1][1] = 55 slice2[1][2] = 6
slice1 append: [[1 2 3] [4 5 66] [10 20 30 40]]
slice1 append: [[1 2 3 10 20 30 40] [4 5 66] [10 20 30 40]]
slice1 copy before: [[1 2 3 10 20 30 40] [4 5 66] [10 20 30 40]]
slice2 copy before: [[100 200 30 400] [4 55 6]]
slice1 copy: [[100 200 30 400] [4 55 6] [10 20 30 40]]

起始

相关文章:

Golang基础-5

Go语言基础 介绍 基础 切片 切片声明 切片初始化 切片基础操作 多维切片 介绍 本文介绍Go语言中切片(slice)(切片声明、切片初始化、切片基础操作、多维切片)等相关知识。 基础 切片 切片&#xff08;slice&#xff09;是对数组的一个连续片段的引用&#xff0c;切…...

Mysql数据库:故障分析与配置优化

目录 前言 一、Mysql逻辑架构图 二、Mysql单实例常见故障 1、无法通过套接字连接到本地MySQL服务器 2、用户rootlocalhost访问被拒绝 3、远程连接数据库时连接很慢 4、无法打开以MYI结尾的索引文件 5、超出最大连接错误数量限制 6、连接过多 7、配置文件/etc/my.cnf权…...

常见的图像分析算法

图像分析算法是计算机视觉领域中的一个重要分支&#xff0c;它通过使用预先训练的人工智能模型从图像中提取和分析视觉信息。这些算法可以应用于多种场景&#xff0c;如物体识别、图像分类、图像增强、缺陷检测等。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司…...

朵米3.5客服系统源码,附带系统搭建教程

朵米客服系统是一款全功能的客户服务解决方案&#xff0c;提供多渠道支持&#xff08;如在线聊天、邮件、电话等&#xff09;&#xff0c;帮助企业建立与客户的实时互动。该系统具有智能分流功能&#xff0c;可以快速将客户请求分配给适当的客服人员&#xff0c;提高工作效率。…...

Python 踩坑记

前言 回归 Python 栈&#xff0c;相较 Go 的 Coding&#xff0c;Python 确实偏向复杂&#xff0c;看似编码方便快捷的背后&#xff0c;是越来越庞杂的细枝末节&#xff0c;稍不注意就是偏差。如果项目只是“能跑就行”&#xff0c;那大概率遍地是坑。开启踩坑记&#xff5e; …...

搭建Spark单机版环境

在搭建Spark单机版环境的实战中&#xff0c;首先确保已经安装并配置好了JDK。然后&#xff0c;从群共享下载Spark安装包&#xff0c;并将其上传至目标主机的/opt目录。接着&#xff0c;解压Spark安装包至/usr/local目录&#xff0c;并配置Spark的环境变量&#xff0c;以确保系统…...

使用Flutter混淆技术保护应用隐私与数据安全

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…...

ClickHouse初体验

1.clickHouse是啥&#xff1f; ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的列式存储数据库(DBMS)&#xff0c;使用 C语言编写&#xff0c;主要用于在线分析处理查询(OLAP)&#xff0c;能够使用SQL查询实时生成分析数据报告 2.clickHouse的特点 2.1列式存储 对于列的聚合&…...

在k8s中部署高可用程序实践和资源治理

在k8s中部署高可用程序实践 1. 多副本部署1.1. 副本数量1.2. 更新策略1.3. 跨节点的统一副本分布1.4. 优先级1.5. 停止容器中的进程1.6. 预留资源 2. 探针2.1. 活性探针&#xff08;liveness probes&#xff09;2.2. 就绪探针&#xff08;Readiness probe&#xff09;2.3. 启动…...

WebView的使用与后退键处理-嵌入小程序或者 H5 页面

在使用 WebView 嵌入小程序或者 H5 页面时&#xff0c;通常会涉及到处理后退键的操作。在 Android 平台上&#xff0c;可以通过 WebView 的相关方法来实现后退键的处理。你可以按照以下步骤来实现&#xff1a; 在 Activity 或 Fragment 中找到 WebView 控件&#xff0c;并为其…...

【攻防世界】file_include (PHP伪协议+过滤器)

打开题目环境&#xff1a; 进行PHP代码审计&#xff0c;发现这是一个文件包含漏洞。 我们尝试利用PHP伪协议中的 php://filter来读取 check.php 中的内容。 构造payload 并提交&#xff1a; 发现payload被过滤掉了&#xff0c;我们就需要尝试使用不同的转换器。 PHP各类转换…...

Linux 内核中PHY子系统(网络):PHY驱动

一. 简介 PHY 子系统就是用于 PHY 设备相关内容的&#xff0c;分为 PHY 设备和 PHY 驱动&#xff0c;和 platform 总线一样&#xff0c;PHY 子系统也是一个设备、总线和驱动模型。 前面一篇文章学习了 PHY子系统中的 PHY设备。文章如下&#xff1a; Linux 内核中PHY子系统(网…...

【六 (1)机器学习-机器学习算法简介】

目录 文章导航一、机器学习二、基于学习方式的分类三、监督学习常见类型四、无监督学习常见类型五、强化学习常见分类 文章导航 【一 简明数据分析进阶路径介绍&#xff08;文章导航&#xff09;】 一、机器学习 机器学习是一门多领域交叉学科&#xff0c;涉及概率论、统计学…...

TCP服务端主动向客户端发送数据

C TCP 服务端和客户端通信的例子 在此基础上&#xff0c;要修改服务端代码&#xff0c;使其能够每秒向客户端发送当前时间&#xff0c;你需要添加一个循环&#xff0c;每次循环发送当前时间给客户端。同时&#xff0c;你需要在客户端代码中添加接收服务端发送的数据的逻辑。 …...

ObjectiveC-03-XCode的使用和基础数据类型

本节做为Objective-C的入门课程&#xff0c;笔者会从零基础开始介绍这种程序设计语言的各个方面。 术语 ObjeC&#xff1a;Objective-C的简称&#xff0c;因为完整的名称过长&#xff0c;后续会经缩写来代替&#xff1b;项目/工程&#xff1a;也称工程&#xff0c;指的是一个A…...

YOLOv9改进策略 :主干优化 | 无需TokenMixer也能达成SOTA性能的极简ViT架构 | CVPR2023 RIFormer

💡💡💡本文改进内容: token mixer被验证能够大幅度提升性能,但典型的token mixer为自注意力机制,推理耗时长,计算代价大,而RIFormers是无需TokenMixer也能达成SOTA性能的极简ViT架构 ,在保证性能的同时足够轻量化。 💡💡💡RIFormerBlock引入到YOLOv9,多个数…...

원클릭으로 주류 전자상거래 플랫폼 상품 상세 데이터 수집 및 접속 시연 예제 (한국어판)

클릭 한 번으로 전자상거래 플랫폼 데이터를 캡처하는 것은 일반적으로 웹 페이지에서 정보를 자동으로 추출 할 수있는 네트워크 파충류 기술과 관련됩니다.그러나 모든 형태의 데이터 수집은 해당 웹 사이트의 사용 약관 및 개인 정보 보호 정책 및 현지 법률 및 규정을 준수…...

2024年github开源top100中文

2024年github开源top100中文 动动美丽的小指头点个赞呗&#xff0c;感谢啦&#xff01;&#x1f495;&#x1f495;&#x1f495;&#x1f618;&#x1f618;&#x1f618; 本文由Butterfly一键发布工具发布 语言star项目名称描述Python45670xai-org/grok-1Grok开源发布Ruby260…...

回收站删除的文件在哪里?专业恢复方法分享(最新版)

“我很想知道我从回收站删除的文件被保存在哪里了呢&#xff1f;我刚刚不小心清空了回收站&#xff0c;现在想将它们恢复&#xff0c;应该怎么操作呢&#xff1f;谁能教教我怎么从回收站恢复文件&#xff1f;” 回收站&#xff0c;作为Windows操作系统中的一个重要组件&#xf…...

什么是工时管理软件?

简而言之&#xff0c;工时管理软件是一种可以帮助管理者跟踪企业员工在项目和任务上花费的时间的软件。然而&#xff0c;工时管理软件不仅是一种收集信息的工具&#xff0c;它还是一种解决方案&#xff0c;使企业能够处理和优化不同的流程和活动&#xff0c;例如工资单、项目预…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...