HarmonyOS第一课-对比Kotlin,快速入门TypeScript

编程语言简介

ArkTS

基础类型

1. 布尔值

  • TypeScript 和 Kotlin: 两者都有 boolean 类型,用于表示 true 或 false。

ts示例:

let isDone:boolean = false

kotlin示例:

val isDone: Boolean = false

2. 数字

  • TypeScript: 有 number 类型,它包括整数和浮点数。它还支持二进制、八进制和十六进制字面量;
  • Kotlin: 有更精细的数字类型,包括 Byte、Short、Int、Long、Float、Double。其中 Int、Long、Float 和 Double 最常用。Kotlin 同样支持十进制、二进制、十六进制和八进制字面量。

ts示例:

let decLiteral: number = 2024

kotlin示例:

val int: Int = 123
val long: Long = 123L
val double: Double = 123.0
val float: Float = 123.0f

3. 字符串

  • TypeScript: 有 string 类型,使用双引号 (“”) 或单引号 (‘’) 来包围字符串。TS中可以使用反引号来创建多行字符串;

  • Kotlin: 也有 String 类型,可以使用双引号 (“”) 包围字符串。此外,Kotlin 支持三引号 (“”") 创建多行字符串。

ts示例:

let name:string = "wangzhengyi"

kotlin示例:

val str: String = "Hello"

4. 数组

  • TypeScript: 使用 Array 类型,可以通过两种方式定义:number[] 或 Array;
  • Kotlin: 使用 Array 类型,有特定的函数用于创建数组,如 arrayOf()、intArrayOf() 等。

ts示例:

// 定义数组
let arr: number[] = [1, 2, 3];// 增加元素
arr.push(4); // arr is now [1, 2, 3, 4]// 删除元素
arr.pop(); // removes the last element, arr is now [1, 2, 3]// 修改元素
arr[0] = 0; // arr is now [0, 2, 3]// 检索元素
let firstElement = arr[0]; // firstElement is 0// 遍历数组
arr.forEach((value, index) => {console.log(`Element at index ${index} is ${value}`);
});

kotlin示例:

// 定义数组
val arr = mutableListOf(1, 2, 3)// 增加元素
arr.add(4) // arr is now [1, 2, 3, 4]// 删除元素
arr.removeAt(arr.size - 1) // removes the last element, arr is now [1, 2, 3]// 修改元素
arr[0] = 0 // arr is now [0, 2, 3]// 检索元素
val firstElement = arr[0] // firstElement is 0// 遍历数组
for ((index, value) in arr.withIndex()) {println("Element at index $index is $value")
}

5. 元组

  • TypeScript: 支持元组,元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。
  • Kotlin: 不直接支持元组,但可以使用 Pair 或 Triple 类来模拟二元组和三元组。

ts示例:

// 定义 Pair
let pair: [number, string] = [1, "one"];// 访问元素
let firstElement = pair[0];  // firstElement is 1
let secondElement = pair[1]; // secondElement is "one"// 修改元素
pair[0] = 2; // pair is now [2, "one"]
pair[1] = "two"; // pair is now [2, "two"]// 遍历 Pair
for (let value of pair) {console.log(`Value is ${value}`);
}// TypeScript 中的元组是固定长度的,所以不能直接添加或删除元素。如果需要改变元组的长度,需要创建一个新的元组。

kotlin示例:

// 定义 Pair
var pair = Pair(1, "one")// 访问元素
val firstElement = pair.first  // firstElement is 1
val secondElement = pair.second // secondElement is "one"// 修改元素 - Kotlin 中的 Pair 是只读的,所以不能直接修改。如果需要改变 Pair 的值,需要创建一个新的 Pair。
pair = Pair(2, "two")  // pair is now (2, "two")// 遍历 Pair
for (value in pair.toList()) {println("Value is $value")
}

6. 枚举

enum类型是对JavaScript标准数据类型的一个补充,使用枚举类型可以为一组数值赋予友好的名字。

ts示例:

// 定义枚举
enum Color {Red,Green,Blue
}// 检索值
let color: Color = Color.Red; // color is Color.Red// 修改值
color = Color.Blue; // color is Color.Blue// TypeScript 中的枚举是不可变的,无法添加或删除成员
// 遍历枚举
for (let name in Color) {if (typeof Color[name] === 'number') {console.log(Color[name]); // 输出枚举值}
}

kotlin:

// 定义枚举
enum class Color {RED,GREEN,BLUE
}// 检索值
var color: Color = Color.RED // color is Color.RED// 修改值
color = Color.BLUE // color is Color.BLUE// Kotlin 中的枚举是不可变的,无法添加或删除成员
// 遍历枚举
for (enumValue in Color.values()) {println(enumValue.name) // 输出枚举名称
}

需要注意的是,TypeScript 和 Kotlin 中的枚举都是不可变的,一旦定义就不能添加或删除成员。这是因为枚举的设计就是为了定义一组固定的值,不应该在运行时改变这些值。

7. null和undefined

  • 在 TypeScript 和 Kotlin 中,null 和 undefined 都表示变量没有值,但它们的使用和语义有所不同;
  • 在 TypeScript 中,null 和 undefined 是两种不同的类型,它们都可以被用作变量的值,表示变量没有值。默认情况下,它们是所有其他类型的子类型,可以赋值给其他类型的变量。
  • 在 Kotlin 中,null 是一个特殊的值,可以被用作所有可空类型的值。Kotlin 提供了空安全的特性,只有明确声明类型为可空的变量才能被赋值为 null。Kotlin 没有 undefined 这个概念,如果一个变量没有值,那么它的值就是 null。

ts示例:

let a: number = null;      // Ok
let b: string = undefined; // Ok

但是,如果在 TypeScript 中启用了 strictNullChecks 选项,那么 null 和 undefined 就只能赋值给它们自己的类型和 void 类型。

let a: number = null;      // Error
let b: string = undefined; // Error
let c: void = undefined;   // Ok

kotlin示例:

var a: String = null  // Error
var b: String? = null // Ok

8. void

  • 在 TypeScript ,void 类型的主要用途是表示函数没有返回值。你可以声明一个 void 类型的变量,但是它只能赋值为 undefined 或 null。
  • 在 Kotlin 中,如果一个函数没有返回任何有用的值,它的返回类型就是 Unit。这个和 TypeScript 中的 void 是类似的

ts示例:

function warnUser(): void {console.log("This is a warning message");
}let unusable: void = undefined;

kotlin示例:

fun warnUser(): Unit {println("This is a warning message")
}

9. unknown和Any

  • 有时候,我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型,那么我们可以使用unknown类型来标识这些变量。
  • 在 TypeScript 中,unknown 是最顶级的类型(top type)。这意味着在启用了严格的类型检查时,可以将任何类型的值赋值给 unknown 类型的变量,但是不能将 unknown 类型的变量赋值给其他类型的变量,并且不能访问 unknown 类型的变量的任何属性,除非你使用类型断言或类型守卫。
  • 在 Kotlin 中,没有一个与 TypeScript 的 unknown 类型完全对应的类型。Kotlin 是静态类型语言,每个变量的类型都在编译时确定。如果你需要一个可以容纳任何类型的变量,可以使用 Any 类型,它是 Kotlin 中所有非空类型的超类。

ts示例:

let value: unknown;value = "Hello"; // OK
value = 123; // OK
value = true; // OKlet valueString: string = value; // Error
value.length; // Errorif (typeof value === "string") {valueString = value; // OK inside this blockconsole.log(value.length); // OK inside this block
}

kotlin示例:

var value: Anyvalue = "Hello" // OK
value = 123 // OK
value = true // OKval valueString: String = value // Error, type mismatchif (value is String) {println(value.length) // OK inside this block
}

10. 联合类型

  • 联合类型(Union Types)表示取值可以为多种类型中的一种;
  • 在 TypeScript 中,联合类型使用 | 字符分隔各个类型;
  • 在 Kotlin 中,没有直接的联合类型的概念。但是你可以使用 sealed class 或者 Any 来模拟联合类型。

ts示例:

let value: string | number | boolean;value = "Hello"; // OK
value = 123; // OK
value = true; // OKif (typeof value === "string") {console.log(value.substr(2)); // OK
}

kotlin示例:

// 使用sealed class
sealed class UnionType {data class TypeString(val value: String) : UnionType()data class TypeInt(val value: Int) : UnionType()data class TypeBoolean(val value: Boolean) : UnionType()
}var value: UnionType = UnionType.TypeString("Hello")when (value) {is UnionType.TypeString -> println(value.value.length)is UnionType.TypeInt -> println(value.value + 1)is UnionType.TypeBoolean -> println(!value.value)
}// 使用Any
var value: Any = "Hello"when (value) {is String -> println(value.length)is Int -> println(value + 1)is Boolean -> println(!value)
}

条件语句

TypeScript 和 Kotlin 都支持传统的条件语句,例如 if-else 和 switch-case,但是在某些方面,它们有一些相似和不同的地方。

if-else 语句

在 TypeScript 和 Kotlin 中,if-else 语句的用法非常相似,都用于进行条件判断。

TypeScript 的 if-else 示例

let number = 5;
if (number > 0) {console.log("Number is positive.");
} else {console.log("Number is not positive.");
}

Kotlin 的 if-else 示例

val number = 5
if (number > 0) {println("Number is positive.")
} else {println("Number is not positive.")
}

但是,Kotlin 的 if-else 还可以作为表达式使用,返回一个值。这在 TypeScript 中是不可能的。

val number = 5
val result = if (number > 0) {"Number is positive."
} else {"Number is not positive."
}
println(result)

switch-case 语句

TypeScript 支持 switch-case 语句,而 Kotlin 使用 when 作为相应的替代。

TypeScript 的 switch-case 示例:

let fruit = "apple";
switch (fruit) {case "banana":console.log("I am a banana.");break;case "apple":console.log("I am an apple.");break;default:console.log("I am not a banana or an apple.");break;
}

Kotlin 的 when 示例

val fruit = "apple"
when (fruit) {"banana" -> println("I am a banana.")"apple" -> println("I am an apple.")else -> println("I am not a banana or an apple.")
}

Kotlin 的 when 表达式比 TypeScript 的 switch-case 更强大,它可以处理更复杂的条件,例如检查一个值是否在某个范围内,或者是否满足某个条件。

Kotlin 的 when 进阶示例:

val x = 10
when {x in 1..10 -> println("x is in the range.")x is Int -> println("x is an Int.")else -> println("None of the above.")
}

函数

函数定义

在 TypeScript 和 Kotlin 中,函数的定义都包括函数名、参数列表和函数体。

TypeScript 函数定义示例

function add(x: number, y: number): number {return x + y;
}

kotlin函数定义

fun add(x: Int, y: Int): Int {return x + y
}

可选参数

在 TypeScript 中,函数的参数可以被标记为可选的,这意味着如果在调用函数时没有提供这个参数,那么这个参数的值为 undefined。

TypeScript 可选参数示例

function greet(name?: string): void {if (name) {console.log(`Hello, ${name}!`);} else {console.log("Hello, world!");}
}

然而,在 Kotlin 中,没有直接的 “可选参数” 的概念,但是可以通过设置参数的默认值来达到类似的效果。

Kotlin 默认参数示例

fun greet(name: String = "world") {println("Hello, $name!")
}

变长参数

TypeScript 和 Kotlin 都支持变长参数,也就是你可以将任意数量的参数作为一个数组传递给函数。

TypeScript 变长参数示例:

function addNumbers(...numbers: number[]): number {let result = 0;for (let number of numbers) {result += number;}return result;
}

Kotlin 变长参数示例:

fun addNumbers(vararg numbers: Int): Int {var result = 0for (number in numbers) {result += number}return result
}

箭头函数

在 TypeScript 和 Kotlin 中,都可以使用箭头函数(又称为 Lambda 表达式),但是他们的语法和行为有些许不同。

TypeScript箭头函数

在 TypeScript 中,箭头函数使用 => 符号,它有以下特性:

  • 它不绑定自己的 this,arguments,super 或 new.target。这些函数内部的关键字将引用最接近的包含它们的非箭头函数。
  • 它不能用作构造函数,也就是说,不能使用 new 关键字调用箭头函数。
  • 它没有 prototype 属性。
  • yield 关键字通常不能在其主体中使用(除非它们被包含在一个允许使用的函数内)。

TS的箭头函数示例:

let add = (x: number, y: number): number => {return x + y;
};
console.log(add(1, 2)); // 输出 "3"

kotlin箭头函数

在 Kotlin 中,Lambda 表达式用 {} 包围,箭头函数使用 -> 符号,例如:

val add = { x: Int, y: Int ->x + y
}println(add(1, 2)) // 输出 "3"

Kotlin Lambda 表达式的一些特性:

  • 如果 Lambda 只有一个参数,那么可以使用默认的参数名 it(如果没有显式地给参数命名的话)。
  • 如果一个函数的最后一个参数是一个函数,那么 Lambda 表达式可以在函数括号外部传入。
  • 如果函数只有一个 Lambda 表达式参数,那么可以完全省略括号。

函数参数

在 TypeScript 和 Kotlin 中,你都可以将函数作为参数传递给另一个函数。以下是一些例子:

TypeScript函数参数

在 TypeScript 中,可以定义一个函数类型,然后将一个匹配此类型的函数作为参数传递给另一个函数。下面是一个例子,其中一个函数接受另一个函数作为参数:

function applyFunction(value: number, func: (x: number) => number): number {return func(value);
}const double = (x: number) => x * 2;console.log(applyFunction(5, double));  // 输出 10

在此例子中,applyFunction 接受一个数字和一个函数作为参数。这个函数接受一个数字并返回一个数字。然后,applyFunction 将其第一个参数传递给这个函数,并返回结果。

kotlin函数参数

在 Kotlin 中,可以使用函数类型来定义一个可以接受其他函数作为参数的函数。以下是一个例子:

fun applyFunction(value: Int, func: (Int) -> Int): Int {return func(value)
}val double = { x: Int -> x * 2 }println(applyFunction(5, double))  // 输出 10

在这个例子中,applyFunction 接受一个整数和一个函数作为参数。这个函数接受一个整数并返回一个整数。然后,applyFunction 将其第一个参数传递给这个函数,并返回结果。

这两个例子展示了 TypeScript 和 Kotlin 中函数作为一等公民的概念,即函数可以被赋值给变量,可以作为参数传递给其他函数,也可以作为其他函数的返回值。

TypeScript 类定义和构造函数

在 TypeScript 中,类定义包括类名、构造函数和成员变量或方法。构造函数在 TypeScript 中被命名为 constructor。示例如下:

class Person {constructor(public name: string, private age: number) {}greet() {console.log(`Hello, my name is ${this.name}`);}
}class Employee extends Person {constructor(name: string, age: number, public department: string) {super(name, age);}greet() {super.greet();console.log(`I work in ${this.department}`);}
}let employee = new Employee("Alice", 25, "Engineering");
employee.greet();  
// 输出 "Hello, my name is Alice"
// 输出 "I work in Engineering"

在上述示例中,Person 类有两个成员变量 name 和 age(age 是私有的),一个公共方法 greet 和一个私有方法 getAge。greet 可以被类的实例访问,而 getAge 只能在类的内部访问。

Kotlin 类定义和构造函数

在 Kotlin 中,主构造函数是类头部的一部分,可以直接在类名后面定义。示例如下:

open class Person(val name: String, private val age: Int) {open fun greet() {println("Hello, my name is $name")}
}class Employee(name: String, age: Int, val department: String) : Person(name, age) {override fun greet() {super.greet()println("I work in $department.")}
}val employee = Employee("Alice", 25, "Engineering")
employee.greet()  
// 输出 "Hello, my name is Alice"
// 输出 "I work in Engineering."

模块

TypeScript 和 Kotlin 中的模块概念主要用于代码的组织和封装,有助于提高代码的可维护性和可重用性。

TypeScript模块

在 TypeScript 中,一个模块就是一个文件。每个 TypeScript 文件都是一个独立的作用域,文件中的变量、函数、类等默认都是私有的。如果你想在其他 TypeScript 文件中使用它们,那么你必须使用 export 关键字来导出它们,然后在其他文件中使用 import 关键字来导入它们。

例如,你可能有一个名为add.ts 的模块,它导出一个 add 函数:

// add.ts
export function add(x: number, y: number): number {return x + y;
}

然后在另一个名为 main.ts 的模块中,你可以导入并使用 add 函数:

// main.ts
import { add } from './math';
console.log(add(1, 2));  // 输出 3

Kotlin模块

在 Kotlin 中,模块(Module)是一种组织代码的方式,它可以包含多个文件、包和类。一个模块可以有自己的构建和测试过程。

Kotlin 中的模块概念更接近于项目或子项目的概念,比如在 IntelliJ IDEA 或 Android Studio 中创建的项目或者子项目就是模块。

此外,Kotlin 还有包(Package)的概念,用于组织相关的类、接口和函数。包名通常与文件的物理布局相匹配,但这并不是必须的。

例如,你可能有一个包含 add 函数的包 com.example.math:

// 在 com/example/math.kt 文件中
package com.examplefun add(x: Int, y: Int): Int {return x + y
}

然后在其他地方,你可以通过 import 关键字来导入并使用 add 函数:

// 在其他文件中
import com.example.addfun main() {println(add(1, 2))  // 输出 3
}

容器类

TypeScript 和 Kotlin 都提供了丰富的容器类,比如数组和集合,用于存储和操作数据。以下是一些示例。

TypeScript

数组

在 TypeScript 中,数组是最常见的容器类,可以用于存储多个元素。数组元素可以通过索引访问和修改,可以添加和删除元素,并且可以使用 for…of 循环进行遍历。

let arr = [1, 2, 3];// 增加元素
arr.push(4);  // arr 现在是 [1, 2, 3, 4]// 删除元素
arr.pop();  // arr 现在是 [1, 2, 3]// 修改元素
arr[0] = 10;  // arr 现在是 [10, 2, 3]// 查询元素
console.log(arr[0]);  // 输出 10// 遍历元素
for (let x of arr) {console.log(x);
}

Map

在 TypeScript 中,Map 是一种内置的集合类型,可以保存键值对,并且键可以是任意类型。

创建 Map、添加、删除、修改和查询元素的示例:

// 创建一个新的 Map
let map = new Map<string, number>();// 增加元素
map.set('One', 1);// 查询元素
console.log(map.get('One'));  // 输出 1// 修改元素
map.set('One', 100);
console.log(map.get('One'));  // 输出 100// 删除元素
map.delete('One');
console.log(map.get('One'));  // 输出 undefined// 遍历 Map
map.set('Two', 2);
map.set('Three', 3);
for (let [key, value] of map) {console.log(`${key}: ${value}`);
}

Set

在 TypeScript 中,Set 是一种内置的集合类型,可以保存无重复的元素。
创建 Set、添加、删除和查询元素的示例:

// 创建一个新的 Set
let set = new Set<number>();// 增加元素
set.add(1);// 查询元素
console.log(set.has(1));  // 输出 true// 删除元素
set.delete(1);
console.log(set.has(1));  // 输出 false// 遍历 Set
set.add(2);
set.add(3);
for (let value of set) {console.log(value);
}

Kotlin

List

在 Kotlin 中,有两种类型的容器:不可变的(例如 List)和可变的(例如 MutableList)。不可变容器只能进行查询和遍历,不能进行添加、删除和修改。可变容器则支持所有操作。

val list = mutableListOf(1, 2, 3)// 增加元素
list.add(4)  // list 现在是 [1, 2, 3, 4]// 删除元素
list.removeAt(list.lastIndex)  // list 现在是 [1, 2, 3]// 修改元素
list[0] = 10  // list 现在是 [10, 2, 3]// 查询元素
println(list[0])  // 输出 10// 遍历元素
for (x in list) {println(x)
}

Map

在 Kotlin 中,有两个 Map 接口:Map 和 MutableMap。Map 是不可变的,只提供了查询操作,不能添加、删除和修改元素。MutableMap 是可变的,可以添加、删除和修改元素。

创建 MutableMap、添加、删除、修改和查询元素的示例:

// 创建一个新的 MutableMap
val map = mutableMapOf<String, Int>()// 增加元素
map["One"] = 1// 查询元素
println(map["One"])  // 输出 1// 修改元素
map["One"] = 100
println(map["One"])  // 输出 100// 删除元素
map.remove("One")
println(map["One"])  // 输出 null// 遍历 Map
map["Two"] = 2
map["Three"] = 3
for ((key, value) in map) {println("$key: $value")
}

Set

在 Kotlin 中,有两个 Set 接口:Set 和 MutableSet。Set 是不可变的,只提供了查询操作,不能添加和删除元素。MutableSet 是可变的,可以添加和删除元素。

创建 MutableSet、添加、删除和查询元素的示例:

// 创建一个新的 MutableSet
val set = mutableSetOf<Int>()// 增加元素
set.add(1)// 查询元素
println(set.contains(1))  // 输出 true// 删除元素
set.remove(1)
println(set.contains(1))  // 输出 false// 遍历 Set
set.add(2)
set.add(3)
for (value in set) {println(value)
}

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

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

相关文章

hadoop 配置历史服务器 开启历史服务器查看 hadoop (十)

1. 配置了三台服务器&#xff0c;hadoop22, hadoop23, hadoop24 2. hadoop文件路径: /opt/module/hadoop-3.3.4 3. hadoop22机器配置历史服务器的配置文件&#xff1a; 文件路径&#xff1a;/opt/module/hadoop-3.3.4/etc/hadoop 文件名称&#xff1a;mapred-size.xml 新增历…

帮我想几个关于实人认证API的中文文章标题

引言 随着信息时代的迅速发展&#xff0c;数据变得愈加庞大和复杂。在这个大数据的时代&#xff0c;企业面临着海量信息的管理和利用挑战。为了更有效地获取并利用数据&#xff0c;企业信息模糊搜索API成为了企业数据智能引擎的一部分&#xff0c;为企业提供了精准的企业列表检…

RK3588产测软件介绍

1. 简介 本公司研发的产测软件是用于在量产的过程中快速地甄别产品功能和器件的好坏&#xff0c;即重点 FCT&#xff08;Functional Test&#xff09;测试&#xff0c;进而提高生产效率和检测的准确性。 2. 产测软件介绍 QT开发的ARM平台产测图形化软件&#xff0c;一键开启傻…

【问题处理】WPS提示不能启动此对象的源应用程序如何处理?

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 最近在用WPS打开word文件中&#xff0c;插入的Excel附件时&#xff0c;无法打开&#xff0c;提示&#xff1a;“不能启动此对象的源应用程序”。 经过上网查找处理办法&#xff0c;尝试解决&#xff0c;现将解决过程记…

Linux socket编程(4):服务端fork之僵尸进程的处理

在上一节利用fork实现服务端与多个客户端建立连接中&#xff0c;我们使用fork函数来实现服务端既可以accept新的客户端连接请求&#xff0c;又可以接收已连接上的客户端发来的消息。但在Linux中&#xff0c;在子进程终止后&#xff0c;父进程需要处理该子进程的终止状态&#x…

【开源】基于Vue.js的车险自助理赔系统的设计和实现

项目编号&#xff1a; S 018 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S018&#xff0c;文末获取源码。} 项目编号&#xff1a;S018&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车…

[GFCTF 2021]wordy 编写去花IDAPYTHON

首先查壳 发现没有东西 然后放入ida 发现没有main并且软件混乱 发现这里1144的地方 出错 IDA无法识别数据 报错内容是EBFF 机器码 这里看了wp知道是很常见的花指令 所以我们现在开始去花 这里因为我们需要取出 EBFF 下面的地址也都是 EBFF 所以工作量大 使用IDApython脚本即…

EasyRecovery2024最新永久破解版本安装包下载

当我们处理重要的文件数据时&#xff0c;遇到突然停电导致数据来不及保存&#xff0c;再次打开电脑后&#xff0c;此前处理的数据可能丢失&#xff0c;这无疑会影响我们的工作进度&#xff0c;数据恢复软件在此时就派上用场&#xff0c;那么下面就来具体介绍EasyRecovery软件的…

FL Studio21怎么破解?2024年最新FLStudio21.2.0安装解锁特别版下载使用图文教程

用FL Studio编曲&#xff0c;让音乐成为你的翅膀&#xff0c;飞翔在无尽的创作海洋中吧&#xff01; FL Studio作为一款功能强大且备受赞誉的音乐制作软件&#xff0c;为你提供了一个独特的创作平台。通过FL Studio&#xff0c;你可以自由地创作、编曲&#xff0c;制作属于自己…

4.6 Windows驱动开发:内核遍历进程VAD结构体

在上一篇文章《内核中实现Dump进程转储》中我们实现了ARK工具的转存功能&#xff0c;本篇文章继续以内存为出发点介绍VAD结构&#xff0c;该结构的全程是Virtual Address Descriptor即虚拟地址描述符&#xff0c;VAD是一个AVL自平衡二叉树&#xff0c;树的每一个节点代表一段虚…

springboot中动态api如何设置

1.不需要编写controller 等mvc层&#xff0c;通过接口动态生成api。 这个问题&#xff0c;其实很好解决&#xff0c;以前编写接口&#xff0c;是要写controller&#xff0c;需要有 RestController RequestMapping("/test1") public class xxxController{ ApiOperat…

敏捷DevOps专家王立杰:端到端DevOps持续交付的5P法则 | IDCF

今天有一个流行的英文缩写词用来刻画这个风云变幻的时代&#xff1a;VUCA&#xff08;乌卡时代&#xff09;。四个英文字母分别表示动荡性&#xff08;Volatility&#xff09;、不确定性&#xff08;Uncertainty&#xff09;、复杂性&#xff08;Complexity&#xff09;和模糊性…

C编译流程

1.预处理 hello.c 经过预处理得到 hello.i gcc -E hello.c -o hello.i -E的含义&#xff1a;说明这是一个预处理操作 生成预处理文件(.i) 预处理阶段做了什么事&#xff1a; 1.1 头文件展开 我们发现 原先只有几行的hello.c变成了上千行的hello.i 实际上 预处理完成的是 将头…

Unity中Shader反射环境

文章目录 前言一、制作反射环境的两种办法法1&#xff1a;属性面板接收一个 Cubemap 作为反射环境法2&#xff1a;把环境烘焙成一张Cubemap 二、在Unity中实现把环境烘焙成一张Cubemap1、先创建一个反射探针&#xff08;可以直接创建&#xff0c;也可以空物体增加组件&#xff…

【Linux】:进程间通信和日志模拟

进程间通信 一.基本概念二.简单的通信-管道(匿名管道)1.建立通信信道2.通信接口 三.命名管道三.模拟命名管道通信&#xff08;加上日志&#xff09;1.完整代码2.基本使用 一.基本概念 是什么 两个或多个进程实现数据层面的交互。 因为进程独立性的存在&#xff0c;导致进程间…

广度优先算法(BFS)

广度优先算法&#xff08;Breadth-First Search&#xff09;是在图和树领域的搜索方法&#xff0c;其核心思想是从一个起始点开始&#xff0c;访问其所有的临近节点&#xff0c;然后再按照相同的方式访问这些临近节点的节点&#xff0c;这种访问方式类似涟漪泛起&#xff0c;一…

HINSTANCE是什么?

HINSTANCE 就是 HMODULE&#xff1a;

队列OJ--循环队列

目录 题目链接&#xff1a;622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09;​​​​​ 题解&#xff1a; ​编辑 代码实现&#xff1a; 完整代码&#xff1a; 题目链接&#xff1a;622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09;​​​​​ 题解&#x…

jenkins传参给robotframework

在做自动化的时候&#xff0c;需要使用jenkins传参给rf&#xff0c;rf根据传来的变量运行&#xff0c;在将变量传递给py脚本文件。特此记录。 一、配置jenkins 构建的命令使用如下格式即可&#xff08;注意空格&#xff09;&#xff1a; cd D:\xxx\test call pybot --variabl…

砖家测评:腾讯云标准型S5服务器和s6性能差异和租用价格

腾讯云服务器CVM标准型S5和S6有什么区别&#xff1f;都是标准型云服务器&#xff0c;标准型S5是次新一代云服务器规格&#xff0c;标准型S6是最新一代的云服务器&#xff0c;S6实例的CPU处理器主频性能要高于S5实例&#xff0c;同CPU内存配置下的标准型S6实例要比S5实例性能更好…