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

Golang Study 进阶

Golang

本文章中记录一些 Golang 中的语言特性,包括 init 函数,面向对象,defer 关键字,并发编程等。

init 函数与导包

init函数的执行流程是早于main函数的,如果想在main函数执行前做一些事情,可以在init函数中去完成

import ("fmt",// .表示 导入当前包中的所有方法到当前的包中,直接使用API调用 不要轻易使用。避免方法名重复 无法识别. "html/template",// _ 表示 导入并不使用 但是会执行当前包的init方法_ "text/template",// myhttp 作为"net/http"包的别名myhttp "net/http"
)

指针

Golang 的指针和 C 语言类型,类型指针不能进行偏移和运算,只需要记住两个符号:&(取地址)和*(根据地址取值)

示例如下:

var var-name *var-type// var-type: 指针类型// var-name:指针变量名// 指定变量作为一个指针
// 代表取指针的值,直接输出变量是地址值

指针交换数字值示例:

package mainimport "fmt"func swap(pa *int, pb *int) {var temp inttemp = *pa // temp = main::a*pa = *pb  // main::a = main::b*pb = temp // main::b = temp
}func main() {var a int = 10var b int = 20var ia *intia = &afmt.Printf("a = %v\n", a)fmt.Printf("&a = %v\n", &a)fmt.Printf("ia = %v\n", ia)fmt.Printf("*ia = %v\n", *ia)fmt.Println("----------------------------------")fmt.Println("a = ", a, "b = ", b)// swapswap(&a, &b)fmt.Println("a = ", a, "b = ", b)
}

defer 执行顺序

表示一个函数在执行之后,结束之前执行的时机。

golang 函数

函数在go语言中是一级公民,所有的功能单元都定义在函数中,可以重复使用,函数包含函数的名称。参数列表和返回值类型,共同构成函数的签名(signature)

go语言 函数特性

  • 普通函数,匿名函数(没有名称的函数),方法(定义在struct上的函数)

  • 不允许函数重载,不允许函数同名

  • 函数不能嵌套函数,但可以嵌套匿名函数

  • 函数是一个值,可以将函数赋值给变量,使得这个变量也成为函数

  • 函数可以作为参数传递给另一个函数

  • 函数的返回值可以是一个函数

  • 函数参数可以没有名称

  • 函数在传递参数的时候,会先拷贝参数的副本,再将副本传递给函数

    func test() (name string, age int)} {name = yuluoage = 20return
    }// 变长参数
    func f3(args... int) {for _, v := range args {fmt.Println("v := %d ", v)}
    }// 函数类型定义
    func sum(a int, b int) int {return a + b
    }func max(a, b int) int {if a > b {return a}return b
    }func main() {f3(1, 2, 3, 4, 7, 8)f3(1, 3, 4)// 定义函数类型type f1 func(int, int) int var ff f1// 赋值函数类型的变量ff = sumff(1, 2)ff = maxff = max(1, 2)
    }
    

golang 高阶函数

一个函数作为函数的参数,传递给另外一个函数,也可以作为一个函数的返回值返回

package mainfunc sayHello(name string) {fmt.Println("Hello, %s" + name)
}//函数作为参数
func f1(name string, f func(string)) {f(name)
}func add(a, b int) int {return a + b
}func sub(a, b int) int {return a - b
}func operation(op string) func(int, int) int {switch op {case "+":return addcase "-":return subdefault:return nil}
}func main() {// 函数作为参数f1("yuluo", sayHello)// 函数作为返回值ff := operation("+")r := ff(1, 2)fmt.Println(r)ff := operation("-")r := ff(1, 2)fmt.Println(r)}

golang匿名函数

golang函数不能嵌套,但是可以通过在函数内部定义匿名函数,实现简单功能的调用

语法:func(参数列表)(返回值)
也可以没有参数和返回值func main() {// 此处没有函数名称 func max(a, b int) int {}max := func(a, b int) int {if a > b {return a}return b}r := max(1, 2)fmt.Println(r)// 自己调用自己r = func(a, b int) int {if a > b {return a}return b}(1, 2)fmt.Println(r)}

golang 闭包

func add() func(y int) int {// x 的作用域是和函数的生命周期绑定在一起的var x intreturn func(y int) int {return x += y}
}func main() {var f = add()fmt.Println(f(10))fmt.Println(f(20))fmt.Println(f(30))}

OOP 面向对象

类型定义和别名

类型定义仅仅只在代码中存在,在编译完成之后不会存在类型别名

package mainfunc main() {type MyInt intvar i MyInti = 00
}

结构体

go 语言中没有面向对象的概念,但是可以使用结构体来实现,面向对象的一些特性。例如:封装,继承和多态等特性

package mainimport "fmt"// Book 表示定义一个结构体 将多个简单类型封装成为一个复杂的数据类型
// 大写表示其他包也可以访问
type Book struct {title stringauth  stringprice int
}// 这里传递的是book的一个副本 原来值不会改变
func changeBook(book Book) {book.title = "huakai"
}// 修改值
func changeBookByRefer(book *Book) {// 这里有自动解引用的过程// 实际为:(*per).name = "huakai"book.title = "huakai"
}func main() {//var book Book//book.title = "go入门"//book.auth = "yuluo"//book.price = 20// 键值对方式初始化// book := Book{//   title: "java入门",//   auth:  "yuluo",//   price: 20,// }// 顺序方式book := Book{"java入门","yuluo",20,}fmt.Println("原本值:", book)changeBook(book)fmt.Println("更改之后的值:", book)changeBookByRefer(&book)fmt.Println("传引用更改之后的值:", book)// 匿名结构体var tom struct {id, age intname string}tom.id = 102tom.age = 20tom.name = "tom"fmt.Printf("%v\n", tom)
}

方法

面向对象中存在类方法的概念,在 go 中没有 go 方法的概念,但是我们可以声明一些方法属于某个结构体

go 语言的方法是一种特殊的函数,定义于 struct 之上(与 struct 关联,绑定),被称为 struct 的接收者(receiver)通俗理解就是:方法是有接收者的函数

type mytype struct {}// receiver (接收者)接受该方法的结构体 mymethod方法名 para参数列表 return_type 返回值列表
func (recevicer mytype) mymethod(para) return_type {}
func (recevicer *mytype) mymethod(para) return_type {}

接口

是一种新的类型定义,把所有具有共性的方法定义在一起,任何其他类型只要是实现了这些方法就是实现了这个接口

/*定义接口*/
type interfae_name interface {method_name1 [return_type]method_name2 [return_type]method_name3 [return_type]
}/*定义结构体*/
type struct_name struct {/*变量定义*/
}/*实现接口方法*/
func (struct_name_var struct_name) method_name1() (return_type) {// 方法实现
}func (struct_name_var struct_name) method_name2() (return_type) {// 方法实现
}

例如 手机和电脑 分别实现 USB 接口,实现读和写功能

type USB interface {read()write()
}// 电脑结构体
type Computer struct {name string
}// 手机结构体
type Mobile struct {name string
}// 电脑实现USB接口
func (c Computer) read() {fmt.Printf("c.name = %v %s\n", c.name, "电脑使用usb接口读取")
}
func (c Computer) write() {fmt.Printf("c.name = %v %s\n", c.name, "电脑使用usb接口写")
}//手机实现use接口
func (m Mobile) read() {fmt.Printf("m.name = %v %s\n", m.name, "手机使用usb接口读取")
}
func (m Mobile) write() {fmt.Printf("m.name = %v %s\n", m.name, "手机使用usb接口写")
}func main() {c := Computer {name: "Dell",}c.read()c.write()m := Mobile {model: "5G",}m.read()m.write()
}

面向对象的表示与封装

package mainimport "fmt"/*
如果类名首字母大写,表示其他包也能够访问 否则只能在类的内部访问
同样的,方法首字母大写,表示可以在其他包中访问,否则只能在本类中访问
go语言的封装特性*/
type Book struct {Title stringAuth  stringPrice int
}func (this Book) show() {fmt.Println("使用show方法输出的 Book 对象", this)
}func (this *Book) GetAuth() string {return this.Auth
}func (this *Book) SetAuth(newName string) {// 这里的this对象是一个副本,并不能真的修改book对象的值// 改入传递指针之后才能修改值this.Auth = newName
}func main() {// 定义book对象book := Book{Title: "java入门", Auth: "yuluo", Price: 100}fmt.Println("原本值:", book)auth := book.GetAuth()fmt.Println("使用get方法", auth)book.SetAuth("huakai")fmt.Println("调用set方法之后的值:", book)book.show()}

面向对象继承

通过结构体的嵌套来实现继承

package mainimport "fmt"// Human 父类
type Human struct {Sex  stringname string
}func (this *Human) Eat() {fmt.Println("Human.Eat()...")
}func (this *Human) Walk() {fmt.Println("Human.walk()...")
}type Teacher struct {Human // 表示继承了Human类中的方法// 在Human上扩展出来的工作属性work string
}// Teacher Eat 重定义父类的方法
func (this *Teacher) Eat() {fmt.Println("Teacher.Eat()...")
}func (this *Teacher) Teach() {fmt.Println("Teacher.Teach()...")
}func main() {h := Human{"男", "lisi"}h.Eat()h.Walk()// 定义子类对象//t := Teacher{h, "教师"}t := Teacher{Human{"男", "yuluo"}, "程序员"}// 调用子类方法t.Eat()t.Teach()// 调用父类方法t.Walk()}

面向对象多态

多态的基本要素:

  • 有一个父类(接口)
  • 有子类(实现了父类接口中的全部方法)
  • 父类类型的变量(指针)指向子类的具体数据变量
package mainimport "fmt"// 本质是一个指针
type Animal interface {Sleep()GetColor() string // 获取动物的颜色GetType() string  // 获取动物的种类
}// 具体的类
type Cat struct {color string // 猫的颜色
}func (this *Cat) Sleep() {fmt.Println("Cat is sleeping……")
}func (this *Cat) GetColor() string {return this.color
}func (this *Cat) GetType() string {return "Cat"
}// 具体的类
type Dog struct {color string // 狗的颜色
}func (this *Dog) Sleep() {fmt.Println("Dog is sleeping……")
}func (this *Dog) GetColor() string {return this.color
}func (this *Dog) GetType() string {return "Cat"
}func main() {// 接口的数据类型, 父类指针var animal Animalanimal = &Cat{"yellow"}// 调用的是 Cat 的 Sleep 方法animal.Sleep()animal = &Dog{"black"}// 调用的是 Dog 的 Sleep 方法 产生多态现象animal.Sleep()
}

空接口含义

interface:通用的万能类型 类似与 java 中的 Object

// 表示map的 key 是 string 类型,value 是 go 中的任意数据类型
map1 := map[string]interface{}

golang 构造函数

package mainimport "fmt"type Person struct {name stringage int
}// Person 对象的构造函数 返回一个person对象的指针
func NewPerson(name string, age int) (*Person, error) {if name == "" {return nil, fmt.Errorf("name 不能为空")}if age < 0 {return nil, fmt.Errorf("年龄不能小于 0")}return &Person{name: name, age: age}, nil
}func main() {person, err := NewPeron("yuluo", 20)if err != nil {fmt.Println(err)}fmt.Println(person)
}

golang 并发编程

协程

golang 通过关键字 go 开启一个携程,使其并发执行

// 例1
func main() {// main线程 顺序执行go test4("yuluo")// go 启动携程 和 主线程同时执行test4("huakai")}func test4(msg string) {for i := 0; i < 5; i++ {fmt.Printf("msg: %v\n", msg)time.Sleep(time.Millisecond * 100)}
}// 例2
package mainimport ("fmt""time"
)// 子 routine
func newTask() {i := 0for {i++fmt.Printf("new Groutine : i = %d\n", i)}
}// 主 goroutine
func main() {// 创建一个goroutine 取执行newTask进程go newTask()i := 0for {i++fmt.Printf("main goroutine : i = %d\n", i)time.Sleep(time.Duration(i))}
}

channel

用于携程(goroutine)之间进行通信

创建channel语法

channel的有缓冲和无缓冲问题

  • 当channel已经满了,在向里面写值,就会阻塞
  • 如果channel为空,从里面取值,也会阻塞
// 通道由 make 函数创建
unbuffered := make(chan int)   		 // 整型无缓冲通道
buffered := make(chan int, 10) 		// 整型缓冲通道

协程发送数据到通道:

goroutine1 := make(chan string, 5)  // 字符串缓冲通道,5表示通道能包含5个值
goroutine <- "hello" 				// 通过通道发送字符串

从通道接受值:

data := <- goroutine1 				// 从通道接受值

<- 在通道左边表示接受值,在通道右边表示发送值

  • 同一个通道,发送和接受操作是互斥的;
  • 发送和接受操做在完全完成之前会被阻塞;
func main() {// 用go创建承载一个形参为空,返回值为空的一个函数go func() {defer fmt.Println("A.defer")func() {defer fmt.Println("B.defer")// 退出当前的两个函数runtime.Goexit()fmt.Println("B")// ()表示在创建了一个匿名函数之后,调用此匿名函数}()fmt.Println("A")}()// go一个有参数的函数go func(a int, b int) {fmt.Println(a, b)// 调用此匿名函数并传参}(1, 2)// 死循环for {time.Sleep(1 * time.Second)}}
package mainimport "fmt"func main() {// 定义一个channel  channel同时也会保证go routine的执行顺序c := make(chan int)// 创建两个go routinego func() {defer fmt.Println("go routine 结束")fmt.Println("go routine 正在运行……")// 给chan中存值 将666发送给cc <- 666}()// 从C中取出值 并赋值给numnum := <-cfmt.Println("channel中的值:", num)fmt.Println("main routine 结束")}

如果chann中没有值的话,线程会一直阻塞,直到有值之后,在拿出来值。保证了 go routine 的执行顺序

channe l和 range 混合使用(channel 遍历)

for data := range c {fmt.Println(data)
}

channer和select混合使用

  • 单流程下一个go只能监控一个channel的执行状态,select可以完成监控多个channel的运行状态
select {case <- chan1:// 如果chan1成功读到数据,则进行该操作case chan2 <- 1:// 如果chan2写入数据成功,则进行该操作default:// 如果上面都没成功,执行此操作
}

WaitGroup 同步

线程之间互相等待时使用,A线程没有执行完成,使用此关键字通知B线程等A线程一会

func main() {// 启动10个协程(线程)for i := 0; i < 10; i++ {go showMsg(6)}// 主协程fmt.Println("end...")}func showMsg(i int) {fmt.Println(i)
}

运行如上代码时,主携程并不会等待10个协程执行完毕后在结束,而是自己结束。加入 WairGroup 就可以在10个协程执行完成之后再结束主协程

package mainimport ("fmt""sync"
)var wg sync.WaitGroupfunc main() {   // 启动10个协程(线程)for i := 0; i < 10; i++ {go showMsg(i)wg.Add(1)}// 等待wg.Wait()// 主协程fmt.Println("end...")}func showMsg(i int) {// 在执行之后,结束之前执行的时机defer wg.Done()fmt.Println(i)
}

go mod 常用命令

命令作用
go mod int生成go.mod文件
go mod download下载go.mod文件中指明的所有依赖
go mod tidy整理现有的依赖
go mod graph查看现有的依赖结构
go mod edit编辑go.mod文件
go mod vendor导出项目所有的依赖到vendor目录
go mod verify检验一个模块是否被篡改过
go mod why查看为什么需要依赖某模块

golang proxy 选项

这个环境变量主要是用户设置Go模块代理,作用是用于使GO在后续拉取模块版本时直接通过镜像站点快速拉取。

默认值是:https://proxy.golang.org,direct

默认的代理国内访问不了,需要设置国内的代理

  • 阿里云

    https://mirrors.aliyun.com/goproxy

  • 七牛云

    https://goproxy.cn,direct

direct: 如果在改镜像找不到这个包,会去原本的源拉取

相关文章:

Golang Study 进阶

Golang 本文章中记录一些 Golang 中的语言特性&#xff0c;包括 init 函数&#xff0c;面向对象&#xff0c;defer 关键字&#xff0c;并发编程等。 init 函数与导包 init函数的执行流程是早于main函数的&#xff0c;如果想在main函数执行前做一些事情&#xff0c;可以在init函…...

Shopee买家通系统详细功能介绍

Shopee买家通系统是一款全自动化操作的软件&#xff0c;可以批量注册买家号、自动加购加心愿单、自动下单等。 批量注册买家号 准备好相应资料后&#xff0c;在运行注册时可以自动输入手机号、自动输入短信、自动输入设置的密码。 自动加购加心愿单 根据设置的关键词及产品编…...

git生成gitee和github两个不同的公钥

配置多个公钥 Windows 用户建议使用 Windows PowerShell 或者 Git Bash&#xff0c;在 命令提示符 下无 cat 和 ls 命令。 1、生成公钥文件&#xff1a; 通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t rsa -C "Gitee SSH Key" -f ~/.ssh/gitee_be…...

基于SSM的同学录网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…...

第十五节——观察者watch

一、概念 在Vue中&#xff0c;watch是一个用于监听数据变化的功能。它可以监听一个或多个数据&#xff0c;并在数据发生变化时执行相应的操作。当我们需要在数据变化时执行异步操作、计算属性或执行一些副作用时&#xff0c;watch就派上了用场啦。注意。watch默认只能进行浅层…...

tauri 访问静态资源,响应头为Content-Type:‘text/html‘

现象 报错&#xff1a; Error: THREE.FBXLoader: Unknown format. at FBXLoader.parse (index-f8291142.js:22050:15) at Object.onLoad (index-f8291142.js:22033:22) at index-f8291142.js:19769:20 使用threejs 加载fbx模型文件时&#xff0c;返回头中Content-…...

【佳学基因检测】Node.js中如何读取并调用内容

【佳学基因检测】Node.js中如何读取并调用内容 先给出功能实现代码&#xff1a; var http require(http); var fs require(fs); http.createServer(function (req, res) {fs.readFile(jiaxuejiyin.html, function(err, data) {res.writeHead(200, {Content-Type: text/html…...

java根据音频流或者音频的地址获取分贝的工具类

工具类 import lombok.extern.slf4j.Slf4j;import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; import java.io.BufferedInputStre…...

Pycharm出现的一些问题和解决办法

1.每次启动打开多个项目&#xff0c;速度很慢。改为每次启动询问打开哪个单一项目 Setting -> Appearance & Behavior -> System Settings -> Project -> 关闭Reopen projects on startop 2.一直显示《正在关闭项目closing project》&#xff0c;关不上 pycha…...

进程优先级(nice值,top指令),独立性,竞争性,进程切换(时间片),抢占与出让,并发并行概念

目录 优先级 引入 为什么会存在优先级 特点 优先级值 nice值 更改nice值 top指令 独立性 竞争性 进程切换 引入 时间片 上下文切换 调度器 抢占与出让 强占 出让 并发和并行 并发 并行 优先级 引入 与权限不同的是,权限是能不能做的问题,优先级是什…...

若依微服务集成Mybatis-plus详细教程

本章教程,主要介绍,若依开源框架微服务版本,如何集成Mybatis-plus。 目录 一、引入依赖 1、在根pom.xml中的properties里加入Mybatis-plus版本 2、在根pom.xml中引入Mybatis-plus依赖...

WebSocket:实现实时双向通信的利器

WebSocket&#xff1a;实现实时双向通信的利器 WebSocket是一种强大的协议&#xff0c;用于实现实时双向通信&#xff0c;允许客户端和服务器之间建立长久的连接&#xff0c;以便实时传递数据。这个协议在现代Web应用中发挥着至关重要的作用&#xff0c;因为它使得开发实时性要…...

【uniapp】html和css-20231031

我想用控件和样式来表达应该会更贴切&#xff0c;html和css的基础需要看看。 关于html&#xff1a;https://www.w3school.com.cn/html/html_layout.asp 关于css&#xff1a;https://www.w3school.com.cn/css/index.asp html让我们实现自己想要的布局&#xff08;按钮&#xff0…...

Docker Tomcat 搭建文件服务器

本文基于openwrt上进行。 步骤 1: 安装 Docker 如果尚未安装Docker&#xff0c;首先需要安装Docker。根据你的操作系统&#xff0c;参考Docker官方文档来完成安装, 这里不做详细介绍。 步骤 2: 拉去docker Tomcat镜像 进入openwrt管理界面&#xff0c;docker选项中 拉取最新…...

无感刷新 token

文章目录 背景基本思路需解决的问题请求进入死循环标记刷新 token 请求避免请求拦截覆盖 refresh token并发刷新 token 完整代码注意&#xff1a;拦截器注册顺序另一种方案&#xff1a;事件驱动刷新 前景提要&#xff1a; ts 简易封装 axios&#xff0c;统一 API 实现在 confi…...

【MISRA C 2012】Rule 2.6 函数不应该包含未使用的标签声明

1. 规则1.1 原文1.2 分类 2. 关键描述3. 代码实例 1. 规则 1.1 原文 Rule 2.6 A function should not contain unused label declarations Category Advisory Analysis Decidable, Single Translation Unit Applies to C90, C99 1.2 分类 规则2.6&#xff1a;函数不应该包含…...

Ubuntu:使用apache2部署Vue开发的网站

作者:CSDN @ _乐多_ 本文记录了Vue项目打包到部署到ubuntu系统的全部步骤。 文章目录 一、代码打包二、安装 Apache2三、开启/关闭apache23.1 开启3.2 关闭四、部署Vue应用到Apache24.1 首次部署4.2 更新部署五、全部操作截图一、代码打包 首先,确保您已经在本地开发环境中…...

使用IO完成端口实现简单回显服务器

说明 使用IO完成端口实现简单回显服务器&#xff0c;因为是测试用的&#xff0c;所以代码很粗糙。 提醒 使用的是ReadFile、WriteFile来实现Overlapped IO&#xff0c;正式场合应该用WSARecv、WSASend&#xff0c;原因&#xff1a;来自《Windows网络编程技术》 8.2.5节 在这里…...

【ROS】Nav2源码之nav2_behavior_tree详解

1、简介 nav2_bt_navigator实现ROS2节点以行为树的方式来处理。 nav2_behavior_tree模块提供如下功能: 一个c模板类&#xff0c;可以轻松地将ROS2 动作(actions)和服务(services)集成到行为树(Behavior Trees)中。特定于导航的行为树节点。通用的BehaviorTreeEngine类&#…...

SpringBoot---myBatis数据库操作

一&#xff0c;分页查询 现在controller中设置参数&#xff0c;RequestParam(defaultValue "1") 设置默认值 GetMapping public Result page(RequestParam(defaultValue "1") Integer page,RequestParam(defaultValue "10") Integer pageSize…...

力扣541.反转字符串II

原题链接&#xff1a;力扣541.反转字符串II 思路&#xff1a; 其实在遍历字符串的过程中&#xff0c;只要让 i (2 * k)&#xff0c;i 每次移动 2 * k 就可以了&#xff0c;然后判断是否需要有反转的区间。 因为要找的也就是每2 * k 区间的起点&#xff0c;这样写&#xff0c…...

撕掉Hadoop标签,Cloudera未来可期吗?

Cloudera&#xff1a;大数据的弄潮儿 1、Cloudera发展史2、透过Cloudera看清大数据时代的转变3、参考文章 1、Cloudera发展史 说起Cloudera&#xff0c;就不得不提起Hadoop&#xff0c;Cloudera的过去就是Hadoop时代中的一个缩影。作为全球第一家也是最大一家Hadoop商业化公司&…...

排序算法(1)

这里写目录标题 排序插入排序直接插入排序希尔排序 选择排序直接选择排序堆排序向下调整堆排序 交换排序冒泡排序 排序 插入排序 直接插入排序 直接插入排序是O&#xff08;N^2&#xff09;的排序算法 从0下标开始往后排 void InsertSort(int* a,int n)//直接插入排序 {fo…...

Top 5 Cutting-edge technology examples 2023

文章目录 Top 5 Cutting-edge technology examples 20231、Computer Vision2、Natural Language Processing3、Virtual Reality & Augmented Reality4、Deep Machine Learning5、Neuralink Top 5 Cutting-edge technology examples 2023 Cutting-edge technology in 2023 …...

【算法|滑动窗口No.3】leetcode3. 无重复字符的最长子串

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…...

元素的水平居中和垂直几种方案

总结一下各种元素的水平居中和垂直居中方案。 水平居中&#xff1a; 1.行内元素水平居中 text-align: center 定义行内内容&#xff08;例如文字&#xff09;如何相对它的块父元素对齐;不仅可以让文字水平居中&#xff0c;还可以让行内元素水平居中 注意&#xff1a;给行内…...

JS和JQuery的区别

JS和jQuery都是用于前端开发的工具&#xff0c;但是它们有一些重要的区别。主要区别如下&#xff1a; JS是一种编程语言&#xff0c;而jQuery是一个JS库。JS可以与其他语言一起使用&#xff08;如PHP、Python等&#xff09;&#xff0c;而jQuery是JS的一个扩展&#xff0c;只能…...

延时摄影视频制作工具 LRTimelapse mac中文版特点介绍

lrTimelapse mac是一款适用于 Windows 和 macOS 系统的延时摄影视频制作软件&#xff0c;可以帮助用户创建高质量的延时摄影视频。该软件提供了直观的界面和丰富的功能&#xff0c;支持多种时间轴摄影工具和文件格式&#xff0c;并具有高度的可定制性和扩展性。 lrTimelapse ma…...

Mac电脑怎么运行 Office 办公软件

虽然 Office 软件也有 Mac 版本的&#xff0c;但是有蛮多小伙伴用起来还是感觉不得劲&#xff0c;毕竟接触了太久的 Windows&#xff0c;所以想要使用 Windows 版本的 Office 软件。 今天就给大家介绍一下怎么在 Mac 电脑中运行 Windows 版本的办公软件&#xff0c;在这里就需…...

FPGA 如何 固化程序到 FLASH中

1、导出Hardware 2、导出bit文件 3、打开SDK 4、 点击Ok 5、创建工程 6、 输入工程名称&#xff1a;guhua 7、选择 Zynq FSBL 8、单击 guhua、然后点击 build 点击&#xff1a;build all 9、 右键之后&#xff0c;点击&#xff1a;Creat Boot Image 10、点击 Cr…...