Scala 变量和数据类型(第二章)
第二章、变量和数据类型
- 2.1 注释
- 2.2 变量和常量(重点)
- 2.3 标识符的命名规范
- 2.4 字符串输出
- 2.5 键盘输入
- 2.6 数据类型(重点)
- 回顾:Java数据类型
- Scala数据类型
- 2.7 整数类型(Byte、Short、Int、Long)
- 2.8 浮点类型(Float、Double)
- 2.9 字符类型(Char)
- 2.10 布尔类型:Boolean
- 2.11 Unit 类型、Null 类型和 Nothing 类型(重点)
- 2.12 类型转换
- 扩展 Java 面试题(隐式类型转换)
- 2.12.1 数值类型自动转换
- 2.12.2 强制类型转换
- 2.12.3 数值类型和 String 类型间转换
2.1 注释
Scala 注释使用和 Java 完全一样。
注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来,再用代码去体现。
1)基本语法
(1)单行注释://
(2)多行注释:/* /
(3)文档注释:/*
*
*/
2)案例实操
package com.atguigu.chapter02
object TestNotes {def main(args: Array[String]): Unit = {//(1)单行注释://println("dalang")//(2)多行注释:/* *//*println("dalang")println("jinlian")*///(3)文档注释:/**//*//*//*** println("qingge")println("qingge")println("qingge")*/}
}
3) 代码规范
(1)使用一次 tab 操作,实现缩进,默认整体向右边移动,用 shift+tab 整体向左移
(2)或者使用 ctrl + alt + L 来进行格式化
(3)运算符两边习惯性各加一个空格。比如:2 + 4 * 5。
(4)一行最长不超过 80 个字符,超过的请使用换行展示,尽量保持格式优雅
2.2 变量和常量(重点)
常量:在程序执行的过程中,其值不会被改变的变量
0)回顾:Java 变量和常量语法
-
变量类型 变量名称 = 初始值 int a = 10
-
final 常量类型 常量名称 = 初始值 final int b = 20
1)基本语法
- var 变量名 [: 变量类型] = 初始值 var i:Int = 10
- val 常量名 [: 常量类型] = 初始值 val j:Int = 20
注意:能用常量的地方不用变量
2)案例实操
- (1)声明变量时,类型可以省略,编译器自动推导,即类型推导
- (2)类型确定后,就不能修改,说明 Scala 是强数据类型语言。
- (3)变量声明时,必须要有初始值
- (4)在声明/定义一个变量时,可以使用 var 或者 val 来修饰,var 修饰的变量可改变,val 修饰的变量不可改。
package com.atguigu.chapter02
object TestVar {def main(args: Array[String]): Unit = {//(1)声明变量时,类型可以省略,编译器自动推导,即类型推导var age = 18age = 30//(2)类型确定后,就不能修改,说明 Scala 是强数据类型语言。
// age = "tom" // 错误//(3)变量声明时,必须要有初始值
// var name //错误
//(4)在声明/定义一个变量时,可以使用 var 或者 val 来修饰,var 修饰
的变量可改变,val 修饰的变量不可改。var num1 = 10 // 可变val num2 = 20 // 不可变num1 = 30 // 正确//num2 = 100 //错误,因为 num2 是 val 修饰的}
}
- (5)var 修饰的对象引用可以改变,val 修饰的对象则不可改变,但对象的状态(值)却是可以改变的。(比如:自定义对象、数组、集合等等)
object TestVar {def main(args: Array[String]): Unit = {// p1 是 var 修饰的,p1 的属性可以变,而且 p1 本身也可以变var p1 = new Person()p1.name = "dalang"p1 = null// p2 是 val 修饰的,那么 p2 本身就不可变(即 p2 的内存地址不能变),
但是,p2 的属性是可以变,因为属性并没有用 val 修饰。val p2 = new Person()p2.name="jinlian"
// p2 = null // 错误的,因为 p2 是 val 修饰的}
}
class Person{var name : String = "jinlian"
}
2.3 标识符的命名规范
☀️Scala 对各种变量、方法、函数等命名时使用的字符序列称为标识符。即:凡是自己可以起名字的地方都叫标识符。
1)命名规则
Scala 中的标识符声明,基本和 Java 是一致的,但是细节上会有所变化,有以下三种规则:
(1)以字母或者下划线开头,后接字母、数字、下划线
(2)以操作符开头,且只包含操作符(+ - * / # !等)
(3)用反引号....
包括的任意字符串,即使是 Scala 关键字(39 个)也可以
• package, import, class, object, trait, extends, with, type, for
• private, protected, abstract, sealed, final, implicit, lazy, override
• try, catch, finally, throw
• if, else, match, case, do, while, for, return, yield
• def, val, var
• this, super
• new
• true, false, null
2)案例实操
需求:判断 hello、Hello12、1hello、h-b、x h、h_4、ab、Int、、+-/#!、+-/#!1、if、
if
,这些名字是否合法。
object TestName {def main(args: Array[String]): Unit = {// (1)以字母或者下划线开头,后接字母、数字、下划线var hello: String = "" // okvar Hello12: String = "" // okvar 1hello: String = "" // error 数字不能开头var h-b: String = "" // error 不能用-var x h: String = "" // error 不能有空格var h_4: String = "" // okvar _ab: String = "" // okvar Int: String = "" // ok 因为在 Scala 中 Int 是预定义的字符,
不是关键字,但不推荐var _: String = "hello" // ok 单独一个下划线不可以作为标识符,
因为_被认为是一个方法println(_)//(2)以操作符开头,且只包含操作符(+ - * / # !等)var +*-/#! : String = "" // okvar +*-/#!1 : String = "" // error 以操作符开头,必须都是操作符//(3)用反引号`....`包括的任意字符串,即使是 Scala 关键字(39 个)
也可以var if : String = "" // error 不能用关键字var `if` : String = "" // ok 用反引号`....`包括的任意字符串,
包括关键字}
}
2.4 字符串输出
1)基本语法
- (1)字符串,通过+号连接
- (2)printf 用法:字符串,通过%传值。
- (3)字符串模板(插值字符串):通过$获取变量值
2)案例实操
package com.atguigu.chapter02
object TestCharType {def main(args: Array[String]): Unit = {var name: String = "jinlian"var age: Int = 18//(1)字符串,通过+号连接println(name + " " + age)//(2)printf 用法字符串,通过%传值。printf("name=%s age=%d\n", name, age)//(3)字符串,通过$引用
//多行字符串,在 Scala中,利用三个双引号包围多行字符串就可以实现。
//输入的内容,带有空格、\t 之类,导致每一行的开始位置不能整洁对齐。
//应用 scala 的 stripMargin 方法,在 scala 中 stripMargin 默认
是“|”作为连接符,//在多行换行的行头前面加一个“|”符号即可。val s ="""|select| name,| age|from user|where name="zhangsan"""".stripMargin
println(s)
//如果需要对变量进行运算,那么可以加${}val s1 =s"""|select| name,| age|from user|where name="$name" and age=${age+2}""".stripMarginprintln(s1)val s2 = s"name=$name"println(s2)}
}
2.5 键盘输入
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。
1)基本语法
StdIn.readLine()、StdIn.readShort()、StdIn.readDouble()
2)案例实操
需求:可以从控制台接收用户信息,【姓名,年龄,薪水】。
import scala.io.StdIn
object TestInput {def main(args: Array[String]): Unit = {// 1 输入姓名println("input name:")var name = StdIn.readLine()// 2 输入年龄println("input age:")var age = StdIn.readShort()// 3 输入薪水println("input sal:")var sal = StdIn.readDouble()// 4 打印println("name=" + name)println("age=" + age)println("sal=" + sal)}
}
2.6 数据类型(重点)
回顾:Java数据类型
Java基本类型:char、byte、short、int、long、float、double、boolean
Java引用类型:(对象类型)由于Java有基本类型,而且基本类型不是真正意义的对象,即使后面产生了基本类型的包装类,但是仍然存在基本数据类型,所以Java语言并不是真正意思的面向对象。
注意:Java中基本类型和引用类型没有共同的祖先。
Java基本类型的包装类:Character、Byte、Short、Integer、Long、Float、Double、Boolean
Scala数据类型
1)Scala中一切数据都是对象,都是Any的子类。
2)Scala中数据类型分为两大类:数值类型(AnyVal)、引用类型(AnyRef),不管是值类型还是引用类型都是对象。
3)Scala数据类型仍然遵守,低精度的值类型向高精度值类型,自动转换(隐式转换)
6)Null是一个类型,只 有一个对 象就 是null。它是所有引用类型(AnyRef)的子类。
7)Nothing,是所有数据类型的子类,主要用在一个函数没有明确返回值时使用,因为这样我们可以把抛出的返回值,返回给任何的变量或者函数。
4)Scala中的StringOps是对Java中的String增强
5)Unit:对应Java中的void,用于方法返回值的位置,表示方法没有返回值。Unit是 一个数据类型,只有一个对象就是()。Void不是数据类型,只是一个关键字
2.7 整数类型(Byte、Short、Int、Long)
☀️Scala 的整数类型就是用于存放整数值的,比如 12,30,3456 等等。
1)整型分类
2)案例实操
- (1)Scala 各整数类型有固定的表示范围和字段长度,不受具体操作的影响,以保证Scala 程序的可移植性
object TestDataType {def main(args: Array[String]): Unit = {// 正确var n1:Byte = 127var n2:Byte = -128// 错误// var n3:Byte = 128// var n4:Byte = -129}
}
- (2)Scala 的整型,默认为 Int 型,声明 Long 型,须后加‘l’或‘L’
object TestDataType {def main(args: Array[String]): Unit = {var n5 = 10println(n5)var n6 = 9223372036854775807Lprintln(n6)}
}
- (3)Scala 程序中变量常声明为 Int 型,除非不足以表示大数,才使用 Long
2.8 浮点类型(Float、Double)
☀️Scala 的浮点类型可以表示一个小数,比如 123.4f,7.8,0.12 等等。
1)浮点型分类
2)案例实操
☀️Scala 的浮点型常量默认为 Double 型,声明 Float 型常量,须后加‘f’或‘F’。
object TestDataType {def main(args: Array[String]): Unit = {// 建议,在开发中需要高精度小数时,请选择 Doublevar n7 = 2.2345678912fvar n8 = 2.2345678912println("n7=" + n7)println("n8=" + n8)}
}
//运行的结果
n7=2.2345679
n8=2.2345678912
2.9 字符类型(Char)
1)基本说明
- 字符类型可以表示单个字符,字符类型是 Char。
2)案例实操
- (1)字符常量是用单引号 ’ ’ 括起来的单个字符。
- (2)\t :一个制表位,实现对齐的功能
- (3)\n :换行符
- (4)\ :表示\
- (5)" :表示"
object TestCharType {def main(args: Array[String]): Unit = {//(1)字符常量是用单引号 ' ' 括起来的单个字符。var c1: Char = 'a'println("c1=" + c1)
//注意:这里涉及自动类型提升,其实编译器可以自定判断是否超出范围,//不过 idea 提示报错
var c2:Char = 'a' + 1
println(c2)//(2)\t :一个制表位,实现对齐的功能println("姓名\t 年龄")//(3)\n :换行符println("西门庆\n 潘金莲")//(4)\\ :表示\println("c:\\岛国\\avi")//(5)\" :表示"println("同学们都说:\"大海哥最帅\"")}
}
2.10 布尔类型:Boolean
1)基本说明
- (1)布尔类型也叫 Boolean 类型,Booolean 类型数据只允许取值 true 和 false
- (2)boolean 类型占 1 个字节。
2)案例实操
object TestBooleanType {def main(args: Array[String]): Unit = {var isResult : Boolean = falsevar isResult2 : Boolean = true}
}
2.11 Unit 类型、Null 类型和 Nothing 类型(重点)
1)基本说明
2)案例实操
(1)Unit 类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit 类似于 Java 里的 void。Unit 只有一个实例——( ),这个实例也没有实质
object TestSpecialType {def main(args: Array[String]): Unit = {def sayOk : Unit = {// unit 表示没有返回值,即 void}println(sayOk)}
}
(2)Null 类只有一个实例对象,Null 类似于 Java 中的 null 引用。Null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal)
object TestDataType {def main(args: Array[String]): Unit = {//null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型
(AnyVal)var cat = new Cat();cat = null // 正确var n1: Int = null // 错误println("n1:" + n1)}
}
class Cat {
}
(3)Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于 Nothing 是其他任意类型的子类,他还能跟要求返回值的方法兼容。
object TestSpecialType {def main(args: Array[String]): Unit = {def test() : Nothing={throw new Exception()}test}
}
2.12 类型转换
扩展 Java 面试题(隐式类型转换)
2.12.1 数值类型自动转换
当 Scala 程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数值类型,这个就是自动类型转换(隐式转换)。数据类型按精度(容量)大小排序为:
1)基本说明
- (1)自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。
- (2)把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换。
- (3)(byte,short)和 char 之间不会相互自动转换。
- (4)byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型。
2)案例实操
object TestValueTransfer {def main(args: Array[String]): Unit = {//(1)自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有
数据转换成精度大的那种数值类型,然后再进行计算。var n = 1 + 2.0println(n) // n 就是 Double//(2)把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就
会进行自动类型转换。var n2 : Double= 1.0//var n3 : Int = n2 //错误,原因不能把高精度的数据直接赋值和低
精度。//(3)(byte,short)和 char 之间不会相互自动转换。var n4 : Byte = 1//var c1 : Char = n4 //错误var n5:Int = n4//(4)byte,short,char 他们三者可以计算,在计算时首先转换为 int
类型。var n6 : Byte = 1var c2 : Char = 1// var n : Short = n6 + c2 //当 n6 + c2 结果类型就是 int// var n7 : Short = 10 + 90 //错误}
}
注意:Scala 还提供了非常强大的隐式转换机制(隐式函数,隐式类等),我们放在高 级部分专门用一个章节来讲解。
2.12.2 强制类型转换
1)基本说明
自动类型转换的逆过程,将精度大的数值类型转换为精度小的数值类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意。
Java : int num = (int)2.5
Scala : var num : Int = 2.7.toInt
2)案例实操
- (1)将数据由高精度转换为低精度,就需要使用到强制转换
- (2)强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
object TestForceTransfer {def main(args: Array[String]): Unit = {//(1)将数据由高精度转换为低精度,就需要使用到强制转换var n1: Int = 2.5.toInt // 这个存在精度损失//(2)强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级var r1: Int = 10 * 3.5.toInt + 6 * 1.5.toInt // 10 *3 + 6*1
= 36var r2: Int = (10 * 3.5 + 6 * 1.5).toInt // 44.0.toInt =
44println("r1=" + r1 + " r2=" + r2)}
}
2.12.3 数值类型和 String 类型间转换
1)基本说明
在程序开发中,我们经常需要将基本数值类型转成 String 类型。或者将 String 类型转成基本数值类型。
2)案例实操
- (1)基本类型转 String 类型(语法:将基本类型的值+“” 即可)
- (2)String 类型转基本数值类型(语法:s1.toInt、s1.toFloat、s1.toDouble、s1.toByte、s1.toLong、s1.toShort)
object TestStringTransfer {def main(args: Array[String]): Unit = {//(1)基本类型转 String 类型(语法:将基本类型的值+"" 即可)var str1 : String = true + ""var str2 : String = 4.5 + ""var str3 : String = 100 +""//(2)String 类型转基本数值类型(语法:调用相关 API)var s1 : String = "12"var n1 : Byte = s1.toBytevar n2 : Short = s1.toShortvar n3 : Int = s1.toIntvar n4 : Long = s1.toLong}
}
- (3)注意事项
在将 String 类型转成基本数值类型时,要确保 String 类型能够转成有效的数据,比如我们可以把"123",转成一个整数,但是不能把"hello"转成一个整数。var n5:Int = “12.6”.toInt 会出现 NumberFormatException 异常。
扩展面试题
相关文章:

Scala 变量和数据类型(第二章)
第二章、变量和数据类型2.1 注释2.2 变量和常量(重点)2.3 标识符的命名规范2.4 字符串输出2.5 键盘输入2.6 数据类型(重点)回顾:Java数据类型Scala数据类型2.7 整数类型(Byte、Short、Int、Long)…...

【JVM基础内容速查表】JVM基础知识 默认参数 GC命令 工具使用 JVM参数设置、说明、使用方法、注意事项等(持续更新)
目录一、JVM前置知识1. -X、-XX含义2. JVM参数值的类型和设置方式3. 查看GC时用到的命令和JVM参数4. 查看JVM默认参数二、垃圾收集器选择-XX:UseSerialGC-XX:UseParallelGC-XX:UseParallelOldGC-XX:UseParNewGC-XX:UseConcMarkSweepGC-XX:UseG1GC三、垃圾收集器特有参数1. ParN…...
C语言经典编程题100例(61~80)
目录61、练习7-7 矩阵运算62、练习7-8 方阵循环右移63、习题6-1 分类统计字符个数64、习题6-2 使用函数求特殊a串数列和65、习题6-4 使用函数输出指定范围内的Fibonacci数66、习题6-5 使用函数验证哥德巴赫猜想67、习题6-6 使用函数输出一个整数的逆序数68、练习8-2 计算两数的…...

toxssin:一款功能强大的XSS漏洞扫描利用和Payload生成工具
关于toxssin toxssin是一款功能强大的XSS漏洞扫描利用和Payload生成工具,这款渗透测试工具能够帮助广大研究人员自动扫描、检测和利用跨站脚本XSS漏洞。该工具由一台HTTPS服务器组成,这台服务器将充当一个解释器,用于处理恶意JavaScript Pay…...

Keepalived与HaProxy的协调合作原理分析
Keepalived与HaProxy的协调合作原理分析keepalived与haproxy合作场景更好的理解方式协调合作中考虑的问题一、Keepalived以TCP/IP模型角度来分析:二、HaProxy总结:协调合作中考虑的问题的答案虚拟ip:虚拟IP技术,就是一个未分配给客…...
抖音如何找到博主视频推广?筛选博主要看那些数据
近年来抖音视频推广越来越成为企业宣传的热门选择,今天就来和大家聊聊抖音如何找到博主视频推广,以及几种主流的对接方式。一、什么是抖音博主视频推广?抖音博主视频推广就是通过博主的影响力和粉丝量,吸引用户到短视频平台进行观看相关合作…...

Win11的两个实用技巧系列之如何关闭登录密码?
Win11如何关闭登录密码?Win11关闭登录密码的两种解决方法win11是电脑更新后的全新系统,每次开启需要输入密码。有的用户嫌麻烦想要关闭,下面小编就为大家带来了关闭的方法,一起来看看吧有不少用户在升级或者第一次使用Win11系统的时候&#…...
润普挂卷失败之老卷宗对接NP无法获取案件信息问题排查
润普挂卷失败之老卷宗对接NP无法获取案件信息问题排查 写在最前面 根因:NP的dzjzzzfw与老卷宗dzjz服务用的zookeeper不是同一个,且老卷宗指向的zookeeper没有任何一个匹配的dzjzzzfw。仅有消费者,没有任何生产者,导致老卷宗通过…...
产品经理面试题思考及回答思路(一)
求职产品助理/经理岗位,转行产品岗面试真题 关于产品经理岗位能力的思考: 什么是产品经理?为什么要当/选择做产品经理?怎么理解产品经理?如何理解产品经理的价值?产品日常工作有哪些?工作流程…...

Routability-Driven Macro Placement with Embedded CNN-Based Prediction Model
Routability-Driven Macro Placement with Embedded CNN-Based Prediction Model 2019 Design, Automation & Test in Europe Conference & Exhibition (DATE) DOI: 10.23919/DATE.2019.8715126 目录Abstract一、Introduction二、PROBLEM FORMULATION AND PRELIMINARIE…...

论一个上班族如何一次性通过PMP考试
PMP是我工作后考取的一个证书。从准备到通过,花了大约三个月的时间。我之前在某家互联网公司从事程序员的工作,工作一段时间后,天天敲着代码,改着bug,感觉比较迷茫,不知道未来的发展在哪里,都说…...

Web前端:使用Angular CLI时的最佳实践和专业技巧
在web开发业务中,构建高性能的应用程序是首要因素。此外,用开发人员最流行的语言开发一个健壮的网站将始终为构建高功能的网站提供适当的基础网站。相比之下,不可否认,Angular CLI是建立得最好且正在成长的框架之一。Angular CLI简…...

从0到1一步一步玩转openEuler--15 openEuler使用DNF管理软件包
文章目录15.1 搜索软件包15.2 列出软件包清单15.3 显示RPM包信息15.4 安装RPM包15.5 下载软件包15.6 删除软件包DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查询软件包信息,从指定软件库获取软件包,自动处理依赖关系以安装或卸…...

【java】Spring Boot --spring boot项目整合xxl-job
文章目录1、源码下载地址2.文档地址3.源码结构4.初始化数据库脚本5.配置调度中心xxl-job-admin5.1 修改调度中心配置文件:/xxl-job/xxl-job-admin/src/main/resources/application.properties5.2 启动调度中心5.3 访问调度中心管理界面6.创建执行器项目6.3 载入配置…...

视图、索引、存储过程、触发器
视图、索引、存储过程、触发器 group by补充: 规范来说,分组查询中,select后的字段只能是group by的字段或者是聚合函数。mysql在这有一个小优化,分组后如果某个字段的所有记录相同,同样可以select。 视图 视图是虚拟…...
ImportError: cannot import name ‘FlattenObservation‘ from ‘gym.wrappers‘ 解决方案
问题描述 今天在运行openai给出的ppo2的baseline的时候遇到了以下bug: File "/root/code/baselines_openai/baselines/common/cmd_util.py", line 12, in <module> from gym.wrappers import FlattenObservation, FilterObservation ImportErr…...

大件传输的9种方法
不知道你有没有试过用电子邮件进行大文件传输,由于文件大小的限制,往往会发送失败。同时,一些文件共享服务对传输的文件有大小限制,使得你无法与朋友分享电影片段或向客户展示你的工作样本。还有一些要求你注册一个账户࿰…...
将vue2的项目《后台管理模式》转变为vue3版本 (一)
本篇主要讲了将v2项目转变为v3版本,以本人经验愿于各位分享 希望大家可以一起交流!!!! 文章目录一、app 出口位置二 、 index.js 路由配置三、package.json 文件四、 main.js 既然安装插件那就需要引入五、 跨域问题总…...

苹果手机怎么下载手机铃声?图文教程,快速学会
很多小伙伴喜欢使用苹果手机,可是苹果手机里的铃声自己并不是很喜欢听,想要下载一些好听的歌曲更换自己的手机铃声。苹果手机怎么下载手机铃声?别着急,今天小编以图文的方式,教教大家如何使用苹果手机下载手机铃声。 苹…...

AJAX笔记(二)Fetch和axios
1、Fetch 1.1、XMLHttpRequest的缺陷 1.2、fetch的get写法 1.3、fetch的post写法 1.4、fetch的put写法 1.5、fetch的patch写法 1.6、fetch的delete写法 2、axios 2.1、axios的介绍 2.2、axios的get写法 2.3、axios的post写法(图一json写法和图二三form写法&#x…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...