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

Android开发知识学习——Kotlin基础

函数声明

声明函数要用用 fun 关键字,就像声明类要用 class 关键字一样
「函数参数」的「参数类型」是在「参数名」的右边
函数的「返回值」在「函数参数」右边使用 : 分隔,没有返回值时可以省略

  • 声明没有返回值的函数:
 fun main(){println("123")}
  • 声明有返回值的参数:
 fun sum(x:Int,y:Int):Int{println("123")}

变量声明

  • 声明变量需要通过关键字, var 声明可读可写变量, val 声明只读变量

  • 「类型」在「变量量名」的右边,用 : 分割,同时如果满足「类型推断」,类型可以省略

  • 创建对象直接调用构造器,不需要 new 关键字

  • 声明可读可写变量:

var x: Int= 1
  • 声明只读变量:
val username:String = "username"
  • 声明对象
val user:User = User()

类型推断

在变量声明的基础上,如果表达式右边的类型是可以推断出来,那么类型可以省略:

var age = 18
val name = "Hello"
val user = User()

继承类/实现接口

继承类和实现接口都是用的 : ,如果类中没有构造器 ( constructor ),需要在父类类名后面加上 () :

class MainActivity : AppCompatActivity(),View.OnClickListener{}

Java中是这样的

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
}

空安全设计

Kotlin 中的类型分为「可空类型」和「不可空类型」:

  • 不可空类型
val username: EditText
  • 可空类型
val username: EditText?

调用符

  • !! 强行调用符
  • ?. 安全调用符

lateinit 关键字

lateinit 关键字表示变量可以在其初始化表达式被执行之后进行初始化

  • lateinit 只能修饰 var 可读可写变量,因为 val 定义了变量是不可变的,必须在声明时进行初始化
  • lateinit 关键字声明的变量的类型必须是「不可空类型」
  • lateinit 声明的变量不能有「初始值」
  • lateinit 声明的变量不能是「基本数据类型」
    在构造器中初始化的属性不需要 lateinit 关键字

平台类型

在类型后面面加上一个感叹号的类型是「平台类型」,Java 中可以通过注解减少这种平台类型的产生

  • @Nullable 表示可空类型
  • @NotNull @NonNul l 表示不可空类型

类型判断

  • is 判断属于某类型
    在这里插入图片描述

  • !is 判断不属于某类型
    在这里插入图片描述

  • as 类型强转,失败时抛出类型强转失败异常
    在这里插入图片描述

  • as? 类型强转,但失败时不会抛出异常而是返回 null

获取 Class 对象

  • 使用 类名::class 获取的是 Kotlin 的类型是 KClass
MainActivity::class
  • 使用 类名::class.java 获取的是 Java 的类型
startActivity(Intent(this,test::class.java))

setter/getter

在 Kotlin 声明属性的时候(没有使用 private 修饰),会自动生成一个私有属性和一对公开的 setter/getter 函数。
在写 setter/getter 的时候使用 field 来代替内部的私有属性(防止递归栈溢
出)

class User {
var username : String?= null
var password : String?= nullset(value) {field = value}get() {return field}//构造器constructor(){}constructor(username : String?,password : String?){this.username = usernamethis.password = password}
}

为什么 EditText.getText() 的时候可以简化,但是 EditText.setText() 的时候不能和
TextView.setText() 一样简化?
因为 EditText.getText() 获得的类型是 Editable ,对应的如果EditText.setText() 传入的参数也是 Editable 就可以简化了。

val newEditable= Editable.Factory.getInstance().newEditable("Kotlin") et_username.text = newEditable 

构造器

使用 constructor 关键字声明构造器

    //构造器constructor(){}constructor(username : String?,password : String?){this.username = usernamethis.password = password}

如果我们在构造器主动调用了了父类构造,那么在继承类的时候就不能在类的后面加上小括号

constructor(context: Context) : this(context, null)
// 主动调用用了父类的构造器
constructor(context: Context, attr: AttributeSet?) :
super(context, attr)

@JvmField 生成属性

通过 @JvmField 注解可以让编译器只生成一个 public 的成员属性,不生成对应的 setter/getter 函数

   @JvmField
var username : String?= null
 User user = new User();String username = user.username;

Any 和 Unit

  • Any
    Kotlin 的顶层父类是 Any ,对应 Java 当中的 Object ,但是比Object 少了 wait()/notify() 等函数
class User : Any {}
  • Unit
    Kotlin 中的 Unit 对应 Java 中的 void
 fun get():Unit{}

数组

使用 arrayof() 来创建数组,基本数据类型使用对应的 intArrayOf() 等

val list:Array<String> = arrayOf("1", "2", "3", "4")
val Intlist:IntArray = intArrayOf(1, 2, 3, 4)

静态函数和属性

  • 顶层函数
    顶层函数,它并不依赖于任何特定对象或类。顶层函数可以在任何地方直接使用,不需要创建类的实例

类名.调用方法

class MyClass {fun greet(name: String): String {return "Hello, $name"}
}

然后你可以这样创建一个类的实例并调用它的方法:

val myClass = MyClass()  // Create an instance of MyClass
val greeting = myClass.greet("John")  // Call the greet() method on the instance
println(greeting)  // Prints: Hello, John
  • object
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • companion object
    在这里插入图片描述
    在这里插入图片描述
    其中,「顶层函数」直接在文件中定义函数和属性,会直接生成静态的,在 Java 中通过「文件名Kt」来 访问,同时可以通过 @file:JvmName 注解来修改这个「类名」。需要注意,这种顶层函数不要声明在 module 内最顶层的包中,至少要在一个包中例如 com 。不然不能方便使用。objectcompanion object 都是生成单例例对象,然后通过单例对象访问函数和属性的。

@JvmStatic

通过这个注解将 objectcompanion object 的内部函数和属性,真正生成为静态的。
通常使用 @JvmStatic 注解来标记那些需要在 JVM 中直接访问的静态方法或变量。当 Kotlin 代码被编译为 JVM 字节码时,注解处理器会将这些静态方法和变量插入到生成的 Java 类中
在这里插入图片描述
使用 @JvmStatic 注解标记了 greet() 方法。当这个 Kotlin 类被编译为 Java 类时,greet() 方法会被插入到生成的 Java 类中,并且可以直接通过类名来访问,而不需要创建 Kotlin 类的实例。

在 Java 中,你可以像这样调用 currentApplication() 方法:
在这里插入图片描述

单例模式/匿名内部类

通过 object 关键字实现

// 单例
object Singleton {
}
// 匿名内部类
object : Callback {
}

字符串

字符串模版

通过 ${} 的形式来作为字符串模版

val number = 100000000
val text = "支付宝收款${number}元。"
// 如果只是单一的变量,可以省略掉 {}
val text2 = "支付宝收款$number元。

多行字符串

val s = """
我是第一行
我是第二行
我是第三行
""".trimIndent()

区间

200…299 表示 200 -> 299 的区间(包括 299 )

300…399 表示 300 -> 399 的区间(包括 399 )

when 关键字

Java 当中的 switch 的高级版,分支条件上可以支持表达式
在这里插入图片描述

受检异常

Kotlin 不需要使用 try-catch 强制捕获异常

声明接口/抽象类/枚举/注解

// 声明抽象类
abstract class// 声明接口
interface// 声明注解
annotation class// 声明枚举
enmu class

编译期常量

在静态变量上加上 const 关键字变成编译期常量
const 关键字可以用来声明一个编译期常量。这个常量必须在声明时就赋值,而且必须是字面值,不能是函数调用或者表达式。此外,const 常量必须是只读的,不能在运行时修改
在这里插入图片描述

标签

  • 在 Java 中通过 「 类名.this 例如 Outer.this 」 获取目标类引用
    在这里插入图片描述

  • 在 Kotlin 中通过「 this@类名 例如 this@Outer 」获取目标类引用
    在这里插入图片描述

遍历

记得让 IDE 来帮助生成 for 循环

for(item in items)

在这里插入图片描述

内部类

Kotlin 当中,内部类默认是静态内部类
通过 inner 关键字声明为嵌套内部类
在这里插入图片描述

可见性修饰符

默认的可⻅性修饰符是 public
新增的可⻅性修饰符 internal 表示当前模块可⻅

注释

注释中可以在任意地方使用 [] 来引用目标,代替 Java 中的 @param @link等。

非空断言

可空类型强制类型转换成不可空类型可以通过在变量后面加上 !! ,来达到类型转换。

open/final

Kotlin 中的类和函数,默认是被 final 修饰的 ( abstractoverride 例外)

课后题

  1. kotlin编译器会默认创建构造函数吗

在Kotlin中,构造函数与类的其他部分一样,需要进行显式声明。如果你没有声明构造函数,Kotlin编译器会为你生成一个默认的无参构造函数。这个默认构造函数不会调用任何代码,即它是一个空函数

  1. var username : String?= “123”

声明一个名为 username 的可变变量,它的类型是 String?(可空字符串),并初始化为 “123”。如果你需要改变
username 的值,你可以直接给它赋值一个新的字符串或者 null

  1. public var age : Int = 0

在 Kotlin 中,public var age : Int = 0@JvmField var age : Int = 0
都可以用来在 Kotlin 中声明一个公共的、可变的、初始化为 0 的整型变量。然而,这两者并不完全等价。 public var age : Int = 0 是直接在 Kotlin 中声明变量,其默认的可见性就是 public,也就是可以被任何其他代码访问。 而
@JvmField var age : Int = 0 是使用注解 @JvmField,这会生成一个在 Java
中可见的字段。@JvmField 的目的是让 Kotlin 中的变量在 Java 代码中以字段的形式表现出来,而不是通过
gettersetter 方法访问。 这两者的主要区别在于,如果你需要在 Java 中直接访问 Kotlin 变量(而不是通过
getter 和 setter),那么你需要使用 @JvmField。如果你只是在 Kotlin 内部或者在其他支持 Kotlin
的地方使用这个变量,那么你可以直接使用 public var age : Int = 0
总的来说,这两者并不是互为替代的关系,而是根据具体的使用场景来选择使用哪一种。

  • 举例:
    假设你有以下 Kotlin 类定义:
class Person {var name: String = "John"@JvmField var age: Int = 0
}

如果你使用 @JvmField,你可以在 Java 中直接访问和修改 age 变量,如下所示:

Person person = new Person();
person.age = 25; // 可以直接修改 age 变量
int age = person.age; // 通过字段获取 age 值

但是,如果你移除 @JvmField 并使用 public var age: Int = 0,你仍然可以在 Kotlin 中直接访问和修改 age 变量,但是在 Java 中需要通过 getter 和 setter 方法访问它:

Person person = new Person();
person.setAge(25); // 通过 setter 方法修改 age 值
int age = person.getAge(); // 通过 getter 方法获取 age 值

因此,使用 @JvmField 的主要目的是为了在 Java 中直接访问 Kotlin 属性,而无需使用 getter 和 setter 方法。如果你只在 Kotlin 中使用该属性,那么使用 public var age: Int = 0 就足够了。然而,如果你需要与 Java 代码进行互操作,并希望在 Java 中直接访问 Kotlin 属性,那么使用 @JvmField 是更合适的选择。

  1. Kotlin中的this.
    在Kotlin中,this关键字有特殊的意义。它被用来引用当前对象实例。
    在Kotlin中,this关键字有几种用法:
  • 直接引用当前对象的实例:在类的方法中,你可以使用this关键字来引用当前正在执行的对象实例。例如:
class MyClass {var name: String? = nullfun printName() {println(this.name)}
}

在这个例子中,this关键字引用的是正在执行的对象实例,该实例的name属性被打印出来。

  • 引用当前对象的属性或方法:当你需要通过对象来访问其属性或方法时,可以使用this关键字。例如:
class MyClass {var name: String? = nullfun printName() {println(this.name)}
}

在这个例子中,this关键字引用的是正在执行的对象实例,该实例的name属性被打印出来。

  • 在匿名函数或Lambda表达式中引用外部变量:在匿名函数或Lambda表达式中,你可以使用this关键字来引用外部的变量。例如:
fun outerFunction() {val x = 10val action = object : Action<Int> {override fun run(input: Int) {println("Value of x from outer function: $x") // Here, 'this' refers to the outer function's 'x' variable.}}action.run(5)
}

在这个例子中,this关键字引用的是外部函数的变量x。

  1. 【作文题】 使用 Kotlin 获得外部类引用的代码

val outer = /* 外部类引用 */

如果你想在 Kotlin 中获取对外部类的引用,你需要首先将该外部类定义为可访问的,然后你可以在内部类中直接引用它。
例如,假设你有一个名为 OuterClass 的外部类,并且你想在内部类 InnerClass 中获取该类的引用。你可以这样做:

class OuterClass {var name: String? = null
}class InnerClass {val outer: OuterClass? = nullfun printOuterName() {outer?.let {println("Name of the outer class: ${it.name}")}}
}

在这个例子中,OuterClass 是一个外部类,InnerClass 是一个内部类。在 InnerClass 中,我们声明了一个
outer 变量,它是 OuterClass 的一个引用。然后,在 printOuterName 方法中,我们通过 outer
变量访问了外部类的 name 属性。

  1. 【作文题】 下面的 Person 是不是 interface,为什么?

class User : Person()

在您提供的代码中,Person 并不是一个接口,而是一个类。您使用的是 Kotlin 语言,它支持通过冒号(:)来实现接口或类的继承。
在这段代码中,User 类通过使用 : 来继承 Person 类。这表示 User 是 Person 的子类,它继承了 Person 的属性和方法。
如果 Person 是一个接口,那么应该使用 interface Person 来声明。所以在这个代码片段中,Person 不是接口,它是一个类。

相关文章:

Android开发知识学习——Kotlin基础

函数声明 声明函数要用用 fun 关键字&#xff0c;就像声明类要用 class 关键字一样 「函数参数」的「参数类型」是在「参数名」的右边 函数的「返回值」在「函数参数」右边使用 : 分隔&#xff0c;没有返回值时可以省略 声明没有返回值的函数&#xff1a; fun main(){println…...

C++——定义一个 Book(图书)类

完整代码&#xff1a; /*定义一个 Book(图书)类&#xff0c;在该类定义中包括数据成员和成员函数 数据成员&#xff1a;book_name &#xff08;书名&#xff09;、price(价格)和 number(存书数量)&#xff1b; 成员函数&#xff1a;display()显示图书的 情况&#xff1b;borro…...

深度学习之基于YoloV5的道路地面缺陷检测系统(UI界面)

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、道路地面缺陷检测系统四. 总结 一项目简介 基于YoloV5的道路地面缺陷检测系统利用深度学习中的目标检测算法&#xff0c;特别是YoloV5算法&am…...

AcWing94. 递归实现排列型枚举:输出1~n的全排列

题目 把 1∼ n n n 这 n n n 个整数排成一行后随机打乱顺序&#xff0c;输出所有可能的次序。 输入格式 一个整数 n n n。 输出格式 按照从小到大的顺序输出所有方案&#xff0c;每行 1 个。 首先&#xff0c;同一行相邻两个数用一个空格隔开。 其次&#xff0c;对于两…...

神经网络多种注意力机制原理和代码讲解

多种注意力表格&#xff1a; 大神参考仓库链接&#xff1a; 魔鬼面具 对应 name 就是目录&#xff0c;点击即可跳转到对应学习。 nameneed_chaneelpaper SE (2017) Truehttps://arxiv.org/abs/1709.01507 BAM (2018) Truehttps://arxiv.org/pdf/1807.06514.pdf CBAM (2018) Tr…...

前端HTML

文章目录 一、什么是前端前端后端 前端三剑客1.什么是HTML2.编写前端的步骤1.编写服务端2.浏览器充当客户端访问服务端​ 3.浏览器无法正常展示服务端内容(因为服务端的数据没有遵循标准)4.HTTP协议>>>:最主要的内容就是规定了浏览器与服务端之间数据交互的格式 3. 前…...

Jenkins安装(Jenkins 2.429)及安装失败解决(Jenkins 2.222.4)

敏捷开发与持续集成 敏捷开发 敏捷开发以用户的需求进化为核心&#xff0c;采用迭代、循序渐进的方法进行软件开发。在敏捷开发中&#xff0c;软件项目在构建初期被切分成多个子项目&#xff0c;各个子项目的成果都经过测试&#xff0c;具备可视、可集成和可运行使用的特征。…...

vue中哪些数组操作可以重排

以下是Vue中可以重排数组的常用方法的示例&#xff1a; push()&#xff1a;在数组末尾添加一个或多个元素 // 初始化数组 let myArray [1, 2, 3]; // 在数组末尾添加一个元素4 myArray.push(4); console.log(myArray); // [1, 2, 3, 4] // 在数组末尾添加多个元素5和6 myArr…...

订单创建订单确认、收货创建收货确认取消收货、生成库存和领用单发料

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:山JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文…...

yolox转rknn

使用瑞芯微版本的yolox&#xff1a;https://github.com/airockchip/YOLOXpip install torch1.8.1 torchvision0.9.1 torchaudio0.8.1 --no-cache -i https://pypi.tuna.tsinghua.edu.cn/simplepip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --…...

llava1.5模型安装、预测、训练详细教程

引言 本博客介绍LLava1.5多模态大模型的安装教程、训练教程、预测教程&#xff0c;也会涉及到hugging face使用与wandb使用。 源码链接:点击这里 demo链接:点击这里 论文链接:点击这里 一、系统环境 ubuntu 20.04 gpu: 2*3090 cuda:11.6 二、LLava环境安装 1、代码下载…...

一个ppt带你读懂网络安全行业四大顶会之一的ndss论文<<Large Language Model guided Protocol Fuzzing>>

论文下载地址&#xff1a; Large Language Model guided Protocol Fuzzing...

ajax调用springboot后台接口

工具 api测试工具 由于后台接口不是同一个团队编写的&#xff0c;在文档缺失的情况下&#xff0c;需要测试后台接口接收参数类型&#xff0c;可以使用这个工具&#xff0c;注册很方便 页面如下所示&#xff0c;可以选择请求方法是get&#xff0c;或者post 重点介绍两种&…...

2021-arxiv-LoRA Low-Rank Adaptation of Large Language Models

2021-arxiv-LoRA Low-Rank Adaptation of Large Language Models Paper: https://arxiv.org/abs/2106.09685 Code: https://github.com/microsoft/LoRA 大型语言模型的LoRA低秩自适应 自然语言处理的一个重要范式包括对通用领域数据的大规模预训练和对特定任务或领域的适应。…...

dockefile

文章目录 应用的部署MySql的部署Tomcat的部署 dockerfileDocker原理镜像的制作容器转镜像Dockerfile 服务编排Docker Compose Docker 私有仓库 应用的部署 搜索app的镜像拉去app的镜像创建容器操作容器中的app MySql的部署 容器内的网络服务和外部机器无法直接通信外部机器和…...

rpc入门笔记 0x02 protobuf的杂七杂八

syntax "proto3"; // 这是个proto3的文件message HelloRequest{ // 创建数据对象string name 1; // name表示名称&#xff0c;编号是1 }生成python文件 安装grpcio和grpcio-tools库 pip install grpcio #安装grpc pip install grpcio-tools #安装grpc tools生成…...

keepalived与nginx与MySQL

keepalived VRRP介绍 集群&#xff08;cluster&#xff09;技术是一种较新的技术&#xff0c;通过集群技术&#xff0c;可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益&#xff0c;其任务调度则是集群系统中的核心技术。 集群组成后&#xff0c;可…...

Pod基础概念

Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的StatefulSet和Deployment等控…...

WebDAV之π-Disk派盘 + 一叶日记

推荐一款操作方便、界面简洁,记录生活点滴与心情,具有诗情画意的日记软件。 一叶日记是一款记录日记的手机软件,在这款软件中它里面有着各种不同的工具,可以方便用户去随时随地的记录日记,同时里面还有着各种不同的主题背景,可以供用户去选择使用各种功能,给用户记录带…...

在IDEA运行spark程序(搭建Spark开发环境)

建议大家写在Linux上搭建好Hadoop的完全分布式集群环境和Spark集群环境&#xff0c;以下在IDEA中搭建的环境仅仅是在window系统上进行spark程序的开发学习&#xff0c;在window系统上可以不用安装hadoop和spark&#xff0c;spark程序可以通过pom.xml的文件配置&#xff0c;添加…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...