lua 脚本语言 : 基础到高级语法

news2024/9/21 4:34:17
❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基

Lua,它的中文读音非常简单,就是把它的名称当汉语拼音去读,所以我们一般称他为"噜呃"("呃"小点声,最好是轻声),怎么说呢,这门编程语言是一个脚本语言,脚本语言向来都非常简单,Shell、Python都是如此,当然本次的Lua也不例外。
在这里插入图片描述

Lua可能不像Java、Go、C等编程语言那么热门,但是也是在实际开发中比较灵活常用的工具语言之一,下面我们就从Lua的基本介绍开始,快速的学会这门简单高效的编程语言。

目录

    • 1. 引言
    • 2. Lua的基本概念和历史背景
    • 3. Lua语言的特点和优势
      • 3.1 简洁易学
      • 3.2 轻量级高效
      • 3.3 可扩展性强
      • 3.4 安全性高
    • 4. Lua的基本语法和常用数据结构
      • 4.1 基本语法体验
        • 4.1.1 变量和数据类型
        • 4.1.2 运算符及其用法
        • 4.1.3 条件控制语句
        • 4.1.4 循环控制语句
        • 4.1.5 函数定义与调用
        • 4.1.6 基本函数定义与调用
        • 4.1.7 匿名函数(Lambda 函数)
        • 4.1.8 闭包(Closure)
        • 4.1.9 可变参数函数
        • 4.1.10 局部函数和嵌套函数
        • 4.1.11 递归函数
        • 4.1.13 Lua函数返回值的基本语法
        • 4.1.14 Lua中其他语法的使用
      • 常用数据结构
    • 5. Lua在实际项目中的应用场景和示例代码
      • 5.1 游戏开发
      • 5.2 嵌入式系统
      • 5.3 网络编程

1. 引言

Lua,一个轻量级、可扩展的脚本语言,自从1993年由巴西的Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo共同设计以来,已经走过了数十年的发展历程。Lua以其简洁的语法、高效的性能和广泛的应用场景,赢得了开发者们的青睐。本文将详细介绍Lua脚本语言的基本概念、特点、语法结构、应用场景以及学习资源和未来发展趋势。

2. Lua的基本概念和历史背景

Lua是一种动态类型、解释型、轻量级的编程语言,旨在嵌入到其他应用程序中,为其提供脚本化能力。Lua的名称来源于葡萄牙语,意为“月亮”,寓意其小巧、灵活的特性。Lua最初的设计目标是为了解决嵌入式编程中遇到的复杂性和扩展性问题,随着其不断发展,现已广泛应用于游戏开发、Web应用、网络编程等领域。

3. Lua语言的特点和优势

3.1 简洁易学

Lua的语法简洁明了,易于上手。其语法结构类似于C语言,但更加精简,适合快速编写小型脚本。Lua还提供了丰富的库函数和扩展机制,方便开发者快速构建功能强大的应用程序。

3.2 轻量级高效

Lua的运行环境非常轻量,占用资源少,启动速度快。同时,Lua的执行效率也非常高,能够处理大量数据。这使得Lua在嵌入式系统和移动设备上具有广泛的应用前景。

3.3 可扩展性强

Lua提供了C API接口,允许开发者使用C语言编写自定义函数和库,扩展Lua的功能。这使得Lua能够与其他编程语言无缝集成,满足各种复杂的应用需求。

3.4 安全性高

Lua采用沙盒机制,限制了对宿主程序的访问权限,从而保证了脚本执行的安全性。此外,Lua还提供了错误处理机制,能够捕获并处理脚本执行过程中出现的异常和错误。

4. Lua的基本语法和常用数据结构

4.1 基本语法体验

Lua的基本语法包括变量声明、条件语句、循环语句、函数定义等。下面是一个简单的Lua示例代码:

-- 声明变量
local x = 10
local y = 20

-- 条件语句
if x > y then
    print("x is greater than y")
elseif x < y then
    print("x is less than y")
else
    print("x is equal to y")
end

-- 循环语句
for i = 1, 5 do
    print(i)
end

-- 函数定义
function add(a, b)
    return a + b
end

print(add(x, y))
4.1.1 变量和数据类型

在Lua中,变量不需要预先声明,只需要为变量赋值即可。Lua是动态类型语言,变量不需要类型定义,只需要为变量赋值即可。Lua中的变量类型包括:

  • nil:表示一个无效值,在条件表达式中相当于false。
  • boolean:包含两个值:false和true。
  • number:表示双精度类型的实浮点数。
  • string:字符串由一对双引号或单引号来表示。
  • table:Lua中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。
  • function:由C或Lua编写的函数。
  • userdata:表示任意存储在变量中的C数据结构。
  • thread:表示执行的独立线路,用于执行协同程序。
4.1.2 运算符及其用法

Lua中的运算符包括:

  • 算术运算符:+,-,*,/,%,^(求幂)。
  • 关系运算符:==,~=(不等于),<,>,<=,>=。
  • 逻辑运算符:and,or,not。
  • 其他运算符:…(用于函数参数可变数量的表示),#(用于获取字符串或表数据的长度)。
4.1.3 条件控制语句

Lua中的条件控制语句包括:

  • if语句:用于表示条件判断。if条件为true时,执行if语句中的代码块。if条件为false时,如果有else部分,执行else部分代码块,否则跳过if语句后面的代码块。

示例:

a=10
if(a<20)then
    print("a 小于 20")
else
    print("a 大于 20")
end
  • if…elseif…else语句:用于在if条件为false时执行elseif…else语句代码块,用于检测多个条件语句。

示例:

a=100
if(a<20)then
    print("a 小于 20")
elseif(a>20)then
    print("a 大于 20")
else
    print("a 等于 20")
end
4.1.4 循环控制语句

Lua中的循环控制语句包括:

  • while循环:在判断条件为true时会重复执行循环体语句。

示例:

a=10
while(a<20)do
    print("a 的值为:",a)
    a=a+1
end
  • for循环:可以重复执行指定语句,重复次数可在for语句中控制。数值for循环通过exp1、exp2、exp3控制循环次数,泛型for循环通过ipairs或pairs遍历表。

示例:

for i=1,10 do
    print(i)
end
4.1.5 函数定义与调用

在Lua中,函数可以用作数据赋值,也可以作为参数传递。函数可以返回多个值。

示例:

function add(x,y)
    return x+y
end

print(add(1,2))  -- 输出:3

在 Lua 中,函数的定义和调用是非常灵活和强大的。除了基本的函数定义和调用,Lua 还支持一些特殊的函数语法,如匿名函数、可变参数函数等。

4.1.6 基本函数定义与调用

基本函数定义使用 function 关键字,后面跟着函数名和参数列表,然后是函数体。

function myFunction(arg1, arg2)
    -- 函数体
    return arg1 + arg2
end

local result = myFunction(3, 4)  -- 调用函数,将返回值赋值给变量 result
4.1.7 匿名函数(Lambda 函数)

匿名函数没有名字,可以直接赋值给变量。匿名函数通常用于高阶函数和回调函数中。

local function1 = function(x, y)
    return x + y
end

-- 或者使用匿名函数简写形式
local function2 = function(a, b) return a + b end

local anonymousFunction = function(x, y) return x * y end
local result = anonymousFunction(5, 6)  -- 调用匿名函数
4.1.8 闭包(Closure)

闭包是指函数及其相关引用环境的组合。闭包可以在函数之外访问和修改函数的局部变量。

function makeMultiplier(n)
    return function(m)
        return n * m
    end
end

local double = makeMultiplier(2)  -- 创建一个新的函数,用于将输入乘以2
local product = double(3)  -- 调用新函数,将3乘以2
4.1.9 可变参数函数

Lua 中的函数可以接受可变数量的参数。可以通过 ... 来获取所有额外的参数,它们会作为一个表返回。

function sum(numbers, ...)
    local sum = 0
    for i, v in ipairs(numbers) do
        sum = sum + v
    end
    for i, v in ipairs({...}) do
        sum = sum + v
    end
    return sum
end

local result = sum(1, 2, 3, 4, 5)  -- 调用函数,计算 1 到 5 的和
4.1.10 局部函数和嵌套函数

在函数内部定义的函数称为局部函数。局部函数可以访问外部函数的变量,但不能访问外部函数的外部变量。

function outerFunction()
    local x = 10
    function innerFunction()
        print(x)
    end
    innerFunction()  -- 调用内部函数,输出 10
end
outerFunction()
4.1.11 递归函数

递归函数是调用自身的函数。递归函数常用于解决需要重复执行的问题,如阶乘、斐波那契数列等。

function factorial(n)
    if n == 0 then
        return 1
    else
        return n * factorial(n - 1)
    end
end

local result = factorial(5)  -- 调用函数,计算 5 的阶乘

这些是 Lua 中定义和调用函数的一些常见语法。由于 Lua 语言的灵活性,它提供了很多方法来处理函数,从基本的函数调用到高阶函数和闭包等高级特性。

4.1.13 Lua函数返回值的基本语法

在Lua中,函数返回值的基本语法是在函数体中使用return关键字来指定返回值。返回值可以是单个值,也可以是多个值。

Lua函数返回单个值的语法和示例

如果函数只需要返回一个值,可以直接在return语句后指定该值。例如:

function add(a, b)
    return a + b
end

result = add(3, 4)  -- result = 7

Lua函数返回多个值的语法和示例

如果函数需要返回多个值,可以在return语句后列出所有要返回的值,用逗号分隔。例如:

function maximum(a)
    local mi = 1
    local m = a[mi]
    for i, v in ipairs(a) do
        if v > m then
            mi = i
            m = v
        end
    end
    return m, mi
end

max_value, max_index = maximum({8, 10, 23, 12, 5})  -- max_value = 23, max_index = 3

Lua函数无返回值时的情况

如果函数没有return语句,或者return语句后面没有值,那么函数将默认返回nil。例如:

function no_return()
    -- 没有return语句
end

result = no_return()  -- result = nil

关于Lua函数返回值语法的注意事项和常见问题

  1. Lua函数可以返回任意数量的值,但调用函数时,必须确保接收的变量数量与函数返回值的数量匹配。
  2. 如果函数返回值的数量多于接收的变量数量,超出部分将被丢弃。
  3. 如果函数返回值的数量少于接收的变量数量,多余的变量将自动被赋值为nil
  4. 当函数被当作一个语句调用时(如add(3, 4)),所有返回值都将被丢弃。
  5. 在Lua中,函数调用总是带括号,除非单个参数的函数且参数是字符串或表构造器。
  6. 调用函数时,如果函数只返回一个值,并且该值被用作表达式的一部分(如print(add(3, 4))),那么函数返回的第二个及之后的值将不会被赋值或输出。

以上内容全面涵盖了Lua函数返回值的基本语法、单个返回值的语法、多个返回值的语法,以及无返回值的情况,以及注意事项和常见问题。

4.1.14 Lua中其他语法的使用

Lua中ipairs函数的使用方法和示例

ipairs是一个迭代器函数,它返回一个用于遍历table(表)的迭代器。它只适用于key为整数的table,并且从1开始递增。当遍历到第一个非整数的key或者遍历到nil值时,迭代结束。

local t = {1, 2, 3, "a", 4, nil}
for i, v in ipairs(t) do
    print(i, v)
end

Lua中pairs函数的使用方法和示例

pairs函数也是一个迭代器函数,用于遍历table中的所有key-value对。无论key是整数还是字符串,都可以遍历到。当遍历到nil值时,迭代结束。

local t = {1, 2, 3, "a", 4, nil}
for k, v in pairs(t) do
    print(k, v)
end

Lua中可变参数列表的语法和用法

在Lua中,可以使用...表示不定数量的参数,这就是可变参数列表。它常用于函数调用,也可以用于函数定义中。

function sum(...)
    local s = 0
    for i, v in ipairs{...} do
        s = s + v
    end
    return s
end
print(sum(1, 2, 3, 4, 5)) -- 输出 15

Lua中的not逻辑操作符的作用和用法

not是一个逻辑操作符,用于对布尔值进行取反操作。如果布尔值为true,则not操作符返回false;如果布尔值为false,则not操作符返回true。

print(not true) -- 输出 false
print(not false) -- 输出 true

Lua中的#长度操作符的功能和使用场景

#是Lua中的长度操作符,用于获取table的长度。如果table是一个数组,那么它的长度就是数组中元素的个数;如果table是一个map,那么它的长度就是map中key的数量。

local t = {"a", "b", "c"}
print(#t) -- 输出 3

local m = {x = 1, y = 2, z = 3}
print(#m) -- 输出 3

Lua中的三目表达式的语法结构和用法

三目表达式是Lua中的条件表达式,它的语法结构是条件 ? 值1 : 值2。如果条件为真,则返回值1;如果条件为假,则返回值2。

local a = 10
local b = 20
local max = (a > b) and a or b
print(max) -- 输出 20

常用数据结构

Lua支持多种常用数据结构,包括数字、字符串、表(类似于数组和字典的结合体)、函数等。表是Lua中最重要的数据结构之一,它可以存储任意类型和数量的数据,并支持复杂的操作。。以下是Lua支持的常用数据结构的介绍:

  1. 表(Tables):表是Lua中最为基本的数据结构,它类似于数组和字典的结合体。在表中,每个元素都由一个键值对(key-value pair)表示,键可以是数字或字符串,值可以是任何类型的数据,包括其他表。表在Lua中非常灵活,可以用来表示数组、字典、集合等多种数据结构。
  2. 字符串(Strings):字符串是Lua中的另一种基本数据类型,用于表示文本信息。Lua支持多种字符串操作函数,如连接、截取、替换等,使得字符串处理变得简单方便。
  3. 数字(Numbers):Lua支持两种类型的数字:整数(Integer)和浮点数(Float)。Lua的数字类型没有显式的声明,它们可以自动转换。
  4. 布尔值(Booleans):布尔值是Lua中的逻辑类型,只有两个值:true和false。布尔值常常用于条件判断和逻辑运算。
  5. nil:在Lua中,nil是一个特殊的值,表示空或不存在的值。nil可以用来表示变量的未赋值状态或表示某个值的缺失。
  6. 用户自定义类型:除了上述基本数据类型外,Lua还支持用户自定义类型,包括类(class)和元表(metatable)。用户可以通过定义类来创建自定义对象,通过定义元表来扩展现有类型的功能。

下面是一个使用表的示例代码:

Lua是一种功能强大的脚本语言,它支持多种常用的数据结构,这些数据结构在Lua编程中扮演着重要的角色。以下是Lua支持的几种常用数据结构和它们的用法:

  1. 表(Tables):表是Lua中最基本的数据结构,类似于数组和字典的结合体。在表中,每个元素都由一个键值对(key-value pair)表示,键可以是数字或字符串,值可以是任何类型的数据,包括其他表。表在Lua中非常灵活,可以用来表示数组、字典、集合等多种数据结构。

用法示例

-- 创建一个空表
local table1 = {}

-- 创建一个包含键值对的表
local table2 = {
    key1 = "value1",
    key2 = 123,
    key3 = true
}

-- 访问表中的元素
print(table2.key1) -- 输出 "value1"

-- 修改表中的元素
table2.key1 = "new value"
print(table2.key1) -- 输出 "new value"

-- 添加新的键值对
table2["key4"] = "value4"
print(table2.key4) -- 输出 "value4"

-- 遍历表中的元素
for key, value in pairs(table2) do
    print(key, value)
end
  1. 字符串(Strings):字符串是Lua中的另一种基本数据类型,用于表示文本信息。Lua支持多种字符串操作函数,如连接、截取、替换等,使得字符串处理变得简单方便。

用法示例

-- 创建一个字符串
local str = "Hello, World!"

-- 访问字符串中的字符
print(string.sub(str, 1, 5)) -- 输出 "Hello"

-- 连接字符串
local str1 = "Hello, "
local str2 = "World!"
local str3 = str1 .. str2
print(str3) -- 输出 "Hello, World!"

-- 替换字符串中的子串
local newStr = string.gsub(str, "World", "Lua")
print(newStr) -- 输出 "Hello, Lua!"
  1. 数字(Numbers):Lua支持两种类型的数字:整数(Integer)和浮点数(Float)。Lua的数字类型没有显式的声明,它们可以自动转换。

用法示例

-- 创建一个整数
local num1 = 123

-- 创建一个浮点数
local num2 = 3.14

-- 进行数学运算
local result = num1 + num2
print(result) -- 输出 126.14

5. Lua在实际项目中的应用场景和示例代码

5.1 游戏开发

Lua在游戏开发领域具有广泛的应用。许多知名游戏引擎如Unity和Unreal Engine都支持使用Lua进行游戏逻辑和脚本编写。下面是一个使用Lua实现简单游戏逻辑的示例代码:

-- 玩家类
Player = {
    score = 0,
    
    -- 增加分数
    addScore = function(self, points)
        self.score = self.score + points
    end,
    
    -- 获取分数
    getScore = function(self)
        return self.score
    end
}

-- 创建玩家实例
local player = Player:new()  -- 假设这里有一个:new()方法来创建新实例

-- 增加分数
player:addScore(10)

-- 获取分数并输出
print("Player score: " .. player:getScore())  -- 输出:Player score: 10

5.2 嵌入式系统

Lua在嵌入式系统中也有广泛的应用。通过嵌入Lua解释器到设备中,可以使用Lua脚本来控制和管理设备的功能、处理数据和配置等。下面是一个使用Lua控制嵌入式设备的示例代码(假设有一个名为device的API接口):

-- 打开设备
device.open()

-- 配置设备参数
device.setConfig({
    speed = 100,
    power = 50
})

-- 执行操作
result = device.executeCommand("start")

-- 关闭设备
device.close()

-- 输出结果
print("Operation result: " .. result)

5.3 网络编程

Lua还提供了丰富的网络编程库,如socket库等,可以用于开发网络应用程序和服务器。下面是一个使用Lua实现简单TCP服务器的示例代码:

-- 导入socket库
socket = require("socket")

-- 创建一个TCP服务器
server = socket.bind("*", 12345)

-- 等待客户端连接
connection, err = server:accept()
if not connection then
    print("Error accepting connection: " .. err)
    return
end

-- 接收客户端发送的数据并输出
data, err = connection:receive()
if not data then
    print("Error receiving data: " .. err)
    return
end

print("Received data from client: " .. data)

-- 关闭连接
connection:close()

-- 关闭服务器
server:close()

关注公众号获取更多技术干货 !

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

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

相关文章

[Python学习篇] Python异常

什么是异常&#xff1f; 异常&#xff08;Exception&#xff09;是指在程序执行过程中发生的错误事件&#xff0c;它会中断程序的正常执行流程。异常可以由程序中的错误引发&#xff0c;也可以通过主动抛出异常来处理特殊情况。Python 使用异常处理机制来捕获和处理这些错误&am…

初识c++(构造函数,析构函数,拷贝构造函数,赋值运算符重载)

一、类的默认函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。 #include<iostream> using namespace std; class Date { public:Date(){_year 1;_month 1;_day 1;cout << _year << "/" <&…

日常的学习

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 7.11 resAndroidManifest 笔记 <> <> selector shape resources main下的AndroidMainifest.xml文件 application …

sql注入时间盲注

基于时间的盲注 也叫延时注入。通过观察页面&#xff0c;既没有回显数据库内容&#xff0c;又没有报错信息也没有布尔类型状态&#xff0c;那么我们可以考虑用“绝招”--延时注入。延时注入就是根据页面的响应时间来判断是否存在注入&#xff0c;一点一点注入出数据库的信息。我…

【进阶】利用python内置模块自动化发送邮件及邮件附件

目录 自动化发送邮件 流程&#xff1a; 步骤&#xff1a; 【重点】 【MIMEText--发送文本类型的邮件】 【MIMEImage-发送附件为图片的邮件】 【MIMEBase--发送附件为html报告的邮件】 自动化发送邮件 以qq邮箱为例&#xff0c;提前打开POP3/IMAP/SMTP/Exchange/CardDAV 服…

【web]-信息收集-空白页面

打开是一张图 查看源码&#xff0c;发现就一个链接是有用信息&#xff0c;用目录扫描工具&#xff0c;没有发现有价值的信息。 F12&#xff0c;查看请求和相应信息&#xff0c;在响应头中发现了信息。 还有一个小技巧&#xff1a;点击手机图标&#xff0c;可以切换到手机模式中…

Web浏览器485通讯读取RFID卡号js JavaScript

本示例使用设备&#xff1a;485通讯液显带键盘RFID打菲计件读卡器工位机串口可二次开发编程-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> …

计组_总线

2024.06.21&#xff1a;计算机组成原理总线学习笔记 第23节 总线 3.1 总线的基本概念&#xff08;联想数据通路&#xff09;3.2 总线的分类3.2.1 片内总线&#xff08;CPU芯片内部的总线&#xff09;3.2.2 系统总线3.2.3 通信总线&#xff08;跨系统&#xff0c;408一般不考&am…

四个“一体化”——构建数智融合时代下的一站式大数据平台

随着智能化技术的飞速发展&#xff0c;尤其是以生成式AI为代表的技术快速应用&#xff0c;推动了数据与智能的深化融合&#xff0c;给数据基础设施带来了新的变革和挑战。如何简化日益复杂的系统架构&#xff0c;提高数据处理效率&#xff0c;降低开发运维成本&#xff0c;促进…

十、(正点原子)Linux阻塞和非阻塞IO

阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式&#xff0c;在编写驱动的时候一定要考虑到阻塞和非阻塞。这里的“IO”并不是我们学习 STM32 或者其他单片机的时候所说的“GPIO”(也就是引脚)。这里的 IO 指的是 Input/Output&#xff0c;也就是输入/输出&…

matlab支持向量机使用错误

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

使用Qt和mitmproxy开发一个抓取网页短视频的万能工具

目录 实现原理 mitmproxy介绍 功能简介 安装 脚本示例 如何使用 解释 注意事项 QT工具实现 其他资源 实现原理 使用WebView组件造一工具,工具可输入网页地址并显示网页内容及播放视频。把工具的代理设置指向mitmproxy的端口服务。配合使用mitmproxy的MITM技术,监…

MySql性能调优03-[SQL优化]

SQL优化 MySQL优化SQL优化-不要写select *SQL优化-小表驱动大表&#xff0c;而不是大表驱动小表SQL优化-连接查询代替子查询SQL优化-提升group by的效率 MySQL优化 trace工具 set session optimizer_traceenabledon,end_markers_in_json on; -- 开启trace select * From emplo…

指针详解(2)

指针详解(2) 对数组名的理解 在C语言里数组名还表示着数组首元素地址。 int arr[5] {1, 2, 3, 4, 5}; int* p &arr[0]; int* p arr;以上这两种&#xff0c;对指针p进行赋值的操作均是等价的&#xff0c;都将数组首元素的地址赋给指针p。 不妨&#xff0c;我们可以测…

【C++进阶学习】第六弹——set和map——体会用C++来构建二叉搜索树

set和map基础&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 前言&#xff1a; 在上篇的学习中&#xff0c;我们已经学习了如何使用C语言来实现二叉搜索树&#xff0c;在C中&#xff0c;我们是有现成的封装好的类模板来实现二叉搜索树…

SpringBoot新手快速入门系列教程六:基于MyBatis的一个简单Mysql读写例子

我的教程都是亲自测试可行才发布的&#xff0c;如果有任何问题欢迎留言或者来群里我每天都会解答。 MyBatis和JPA是两种不同的Java持久层框架&#xff0c;各有其优缺点。以下是它们的比较&#xff1a; MyBatis 优点 灵活性高&#xff1a;MyBatis允许手动编写SQL查询&#xf…

AWDAWFAAFAWAWFAWF

创建两张表&#xff1a;部门&#xff08;dept&#xff09;和员工&#xff08;emp&#xff09; 创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称 创建视图v_dept_emp_count(dept…

Ubuntu: gitee免密

安装git sudo apt-get install git下载 git clone XXX SSH keys 第一步&#xff1a;检查本地是否有 SSH Key存在 ls -al ~/.ssh第二步&#xff1a;配置你注册的邮箱 ssh-keygen -t rsa -C "your_emailexample.com"输入命令后一直回车 第三步&#xff1a;获取公钥…

乐观锁原理

乐观锁是一种并发控制的方法&#xff0c;主要用于多线程环境下&#xff0c;用于保证数据的一致性。其核心思想是&#xff1a;"在多个事务中乐观地读取数据&#xff0c;在提交时再验证是否有冲突&#xff0c;如果没有&#xff0c;则提交&#xff1b;如果有&#xff0c;则回…

使用 Apache DolphinScheduler 构建和部署大数据平台,将任务提交至 AWS 的实践经验

作者介绍 李庆旺 - 软件开发工程师&#xff0c;思科 引言 大家好&#xff0c;我是李庆旺&#xff0c;来自思科的软件开发工程师。我们的团队已经使用Apache DolphinScheduler搭建我们自己的大数据调度平台近三年时间。从最初的2.0.3版本开始至今&#xff0c;我们与社区一同成…