HarmonyOS第一课-对比Kotlin,快速入门TypeScript
编程语言简介

基础类型
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)
}
相关文章:
HarmonyOS第一课-对比Kotlin,快速入门TypeScript
编程语言简介 基础类型 1. 布尔值 TypeScript 和 Kotlin: 两者都有 boolean 类型,用于表示 true 或 false。 ts示例: let isDone:boolean falsekotlin示例: val isDone: Boolean false2. 数字 TypeScript: 有 number 类型,…...
【自动驾驶】一些业内自动驾驶专业术语释义
Trajectory 轨迹信息,一般都会发布未来5-10秒的trajactory信息。 Trajectory flicker 轨迹抖动 Nudge 道内避障。在维持车道不变的情况下,横向偏离车道中心以绕开obstacle/agent。 Xlane Nudge 借道避障。借用对向车道或自行车道以绕开obstacle/a…...
好用的博客评论系统 Valine 使用及避坑指南
评论系统,即网站的一个小功能,展示评论内容和用户输入框。开源免费的评论系统可不多,原来很火的"多说"评论系统都关闭了,而Disqus又是国外的访问受限。无意间发现了Valine,挺不错的,分享给大家。…...
【Mysql】[Err] 1293 - Incorrect table definition;
基本情况 SQL文件描述 /* Navicat MySQL Data TransferSource Server : cm4生产-200 Source Server Version : 50725 Source Host : 192.168.1.200:3306 Source Database : db_wmsTarget Server Type : MYSQL Target Server Version : 50725 File…...
SpringBoot——日志及原理
优质博文:IT-BLOG-CN 一、SpringBoot日志 选用 SLF4j(接口)和 logback(实现类),除了上述日志框架,市场上还存在 JUL(java.util.logging)、JCL(Apache Commons Logging)、Log4j、Log4j2、SLF4j…...
7种SQL的进阶用法
1.自定义排序(ORDER BY FIELD) 在MySQL中ORDER BY排序除了可以用ASC和DESC之外,还可以使用自定义排序方式来实现。 CREATE TABLE movies ( id INT PRIMARY KEY AUTO_INCREMENT, movie_name VARCHAR(255), actors VARCHAR(255), price DEC…...
Unity--互动组件(Scrollbar)||Unity--互动组件(DropDown )
此组件中的,交互,过渡,导航与文章(Unity--互动组件(Button))中的介绍如同; handle rect:(父节点矩形) 用于控件的滑动“句柄”部分的图形…...
Unity、UE和Godot的优劣对比
先占位。。。。。。 首先说Unity和UE这两家公司,是行业的两座灯塔,对整个游戏引擎的这个行业的发展具有这种指导性的这种作作用。这两个引擎我从2016年开始就一直在用,结合一下业内的共识,一般来说认为呢,Unity更擅长移…...
CMAK Kafka可视化管理工具
CMAK简介 为了简化开发者和服务工程师维护Kafka集群的工作,yahoo构建了一个叫做Kafka管理器的基于Web工具,叫做 CMAK(原名Kafka Manager)。 这个管理工具可以很容易地发现分布在集群中的哪些topic分布不均匀,或者是分区在整个集群分布不均匀的的情况。 它支持管理多个集…...
PHP如何持续监听Redis的消息订阅并推送到前端?
PHP如何持续监听Redis的消息订阅并推送到前端? 概述: 在许多Web应用程序中,实时推送消息是很常见的需求。当我们需要向前端实时发送消息时,往往会使用轮询或长轮询的方式去获取最新数据。但这种方式对服务器资源的消耗较大,同时响…...
php项目从宝塔面板切换转到phpstudy小皮面板
宝塔面板转phpstudy面板 版本 宝塔面板8.0.1 phpstudy面板8.1.1.3 步骤 1、宝塔面板,找到项目文件夹,打包、下载到本地、解压 2、本地windows系统安装phpstudy面板,选择尽可能一样的配置 比如宝塔php7.4.33,可能phpstudy面板只有php7.4.3,也行 大环境一定要一致,比如…...
基于Acconeer的A121-60GHz毫米波雷达传感器SDK移植及测距示例(STM32L496为例)
基于Acconeer的A121-60GHz毫米波雷达传感器SDK移植及测距示例(STM32L496为例) 工程: Keil工程资源 参考资料: A121 datasheet 1.3 A121 HAL Software Integration User Guide A121 STM32CubeIDE User Guide 官方参考示例工程&a…...
flink1.10袋鼠云 迁移 flink1.15原生环境 事项汇总
表DDL(平台自动生成)修改适配 1 DDL语法不通用 (袋鼠云DDL中支持给别名 DDL采用数据中台生成的模板,并把老版本DDL中的配置通过到相应参数中) 2 袋鼠云DDL支持给别名 sql中字段和DDL中字段不一致. 两种解决方案: 1 FlinkSQL别名语法和袋鼠云略不同 袋鼠云DDL: parseJson(parseJ…...
鸿蒙:Harmony开发基础知识详解
一.概述 工欲善其事,必先利其器。 上一篇博文实现了一个"Hello Harmony"的Demo,今天这篇博文就以"Hello Harmony" 为例,以官网开发文档为依据,从鸿蒙开发主要的几个方面入手,详细了解一下鸿蒙开…...
java_函数式接口
文章目录 一、什么是函数式接口二、四大核心函数式接口三、使用举例 一、什么是函数式接口 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口函数式接口的实例可以通过 lambda 表达式、方法引用或者构造方法引用来创建如果我们在某个接口上声明了 Funct…...
解决selenium访问网页中多个iframe,导致无法锁定元素的问题
解决方法 获取全部的iframe列表调试获取目标iframe使用:browser.switch_to.frame(目标iframe)退回到原有的状态:browser.switch_to.default_content() # 进入另一个iframe browser_iframe_list browser.find_elements(By.CSS_SELECTOR, "iframe&…...
MySQL大表设计
存储大规模数据集需要仔细设计数据库模式和索引,以便能够高效地支持各种查询操作。在面对数亿条数据,每条数据包含数百个字段的情况下,以下是我能想到的在设计数据库的时候需要注意的内容,不足之处欢迎各位在评论区批评指正&#…...
6.基于蜻蜓优化算法 (DA)优化的VMD参数(DA-VMD)
代码原理 基于蜻蜓优化算法 (Dragonfly Algorithm, DA) 优化的 VMD 参数(DA-VMD)是指使用蜻蜓优化算法对 VMD 方法中的参数进行自动调优和优化。 VMD(Variational Mode Decomposition)是一种信号分解方法,用于将复杂…...
OpenCV [c++](图像处理基础示例小程序汇总)
OpenCV [c++](图像处理基础示例小程序汇总) 推荐 原创 NCUTer 2023-04-04 14:18:49 文章标签 Image 图像处理 文章分类 计算机视觉 人工智能 在51CTO的第一篇博文 阅读数1467 一、图像读取与显示 #include<opencv2/opencv.hpp> #include<iostream>using…...
集成多元算法,打造高效字面文本相似度计算与匹配搜索解决方案,助力文本匹配冷启动[BM25、词向量、SimHash、Tfidf、SequenceMatcher]
搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
