kotlin語法和特性分析

核心設計哲學:

  1. 簡潔 (Concise): 減少樣板代碼(如 getter/setter、類型推導),讓代碼表達更直接。
  2. 安全 (Safe): 從語言層面設計來避免常見錯誤(尤其是空指針異常)。
  3. 互操作性 (Interoperable): 與 Java 無縫集成,充分利用現有 Java 生態。
  4. 工具友好 (Tool-friendly): 強大的 IDE(尤其是 IntelliJ IDEA)支持帶來極佳的開發體驗(智能提示、重構、調試)。
  5. 多范式 (Multi-paradigm): 完美融合面向對象編程和函數式編程特性。
  6. 實用主義 (Pragmatic): 特性設計以解決實際問題為目標,避免過度學術化。

深度語法與特性分析

1. 空安全 (Null Safety) - Kotlin 的基石

  • 核心機制:
    • 默認非空: 類型系統嚴格區分可空和非空類型。String 表示永遠不會為 nullString? 表示可能為 null
    • 安全調用 (?.): obj?.method()。如果 obj 非空則調用 method(),否則整個表達式結果為 null。避免鏈式調用中的 NullPointerException (NPE)。
    • Elvis 操作符 (?:): val result = nullableValue ?: defaultValue。提供默認值。
    • 非空斷言 (!!): nullableValue!!.method()。強制認為值為非空,如果為 null 則拋出 KotlinNullPointerException慎用!
    • 安全轉換 (as?): val str: String? = obj as? String。轉換失敗則返回 null
  • 深度影響:
    • 顯著減少 NPE: 這是 Kotlin 最核心的安全特性,將運行時潛在的 NPE 在編譯期就暴露出來,強制開發者處理可能的 null 情況。
    • 提升代碼健壯性: 迫使開發者思考和處理邊界情況。
    • 代碼清晰度: 通過類型簽名 (?) 明確表達變量是否可空,提高了代碼的可讀性和可維護性。

2. 類型系統與類型推導

  • 靜態強類型: 編譯時進行類型檢查。
  • 智能類型推導:
    • val name = "Kotlin" // 編譯器推導出 nameString 類型。
    • val list = listOf(1, 2, 3) // 推導出 List<Int>
    • 極大減少顯式類型聲明: 使代碼更簡潔,尤其在處理復雜表達式和泛型時。
  • Nothing 類型:
    • 含義: 表示永遠不會正常返回的函數返回類型(總是拋出異常或無限循環)。
    • 用途: 標記永遠失敗的操作;作為泛型類型參數的底類型(List<Nothing> 是空列表的類型)。
  • Any 與 Any?:
    • Any: 所有非空類型的超類(相當于 Java 的 Object,但不包含 null)。
    • Any?: 所有類型的超類(包括可空類型)。
  • Unit 類型:
    • 表示“無有意義返回值”的函數返回類型,類似于 Java 的 void。但它是一個單例對象,可以顯式返回 Unit 或省略。
    • Nothing 的關鍵區別:Unit 表示函數正常執行完畢但沒有值返回;Nothing 表示函數根本不正常返回。
  • 類型別名 (typealias):
    • typealias FileTable = MutableMap<File, List<String>>
    • 為復雜類型提供更有意義的名稱,提高代碼可讀性,不創建新類型。

3. 函數式編程 (FP) 特性

Kotlin 將函數視為“一等公民”,提供強大的 FP 支持:

  • 高階函數 (Higher-Order Functions):
    • 函數可以作為參數傳遞或作為返回值返回。
    • list.filter { it > 0 } (filter 接受一個函數參數 { it > 0 } - lambda 表達式)。
    • fun operation(): (Int, Int) -> Int { return ::add } (返回一個函數)。
  • Lambda 表達式:
    • 簡潔的匿名函數:{ a: Int, b: Int -> a + b }
    • 語法糖:
      • 如果 lambda 是最后一個參數,可以移到括號外:list.map { it * it }
      • 如果 lambda 是唯一參數,可以省略括號:list.forEach { println(it) }
      • 單一參數隱式名稱 it: 當 lambda 只有一個參數時,可以省略參數聲明,直接用 it 引用。
  • 擴展函數 (Extension Functions):
    • 核心概念: 無需繼承或修改原始類,即可為現有類(包括第三方庫或 JDK 類)添加新函數。
    • 語法: fun String.removeSpaces(): String { return this.replace(" ", "") } (this 指向接收者對象)。
    • 深度影響:
      • 打破靜態方法工具類的模式,使 API 調用更符合面向對象風格 (myString.removeSpaces() vs StringUtils.removeSpaces(myString)).
      • 極大地提高了代碼的可讀性和表達力。
      • 是構建 領域特定語言 (DSL) 的關鍵技術。
  • 擴展屬性 (Extension Properties):
    • 類似擴展函數,為現有類添加屬性(不能有幕后字段 field,必須通過 getter/setter 計算)。
    • val String.lastChar: Char get() = this[length - 1]
  • 內聯函數 (inline):
    • 目的: 消除高階函數使用 lambda 時帶來的運行時開銷(創建匿名類實例)。
    • 機制: 編譯器將內聯函數的字節碼以及傳遞給它的 lambda 的字節碼直接“復制”到調用點。
    • 效果: 提高性能(尤其在小函數和集合操作中)。
    • 限制與注意: 可能導致生成的字節碼變大;lambda 內部不能使用非局部返回 (return 只能退出內聯函數本身)。
  • 集合操作:
    • 提供豐富的惰性 (Sequences)及早 (Collections) 操作符 (map, filter, reduce, groupBy, flatMap, sortedBy 等),極大地簡化了數據處理管道。

4. 面向對象編程 (OOP) 增強

  • 主構造函數與初始化塊:
    • 類頭聲明主構造函數:class Person(val name: String, var age: Int)。參數直接聲明為屬性 (val 只讀 / var 可變)。
    • init { ... } 塊用于主構造函數調用時的初始化邏輯。
    • 顯著減少了 Java Bean 式的樣板代碼。
  • 屬性 (Properties):
    • 概念: 將字段 (field) 及其訪問器 (getter/setter) 封裝為一個語言特性。
    • 聲明: var property: Type = initializer (自動生成默認 getter/setter) 或 val property: Type = initializer (只生成 getter)。
    • 自定義訪問器:
      var counter: Int = 0set(value) {if (value >= 0) field = value // 'field' 是幕后字段}
      val isAdult: Booleanget() = age >= 18 // 計算屬性
      
  • 數據類 (Data Classes) - data class:
    • 目的: 專門用于持有數據的類。
    • 自動生成: equals()/hashCode(), toString() (格式如 User(name=John, age=30)), componentN() (解構聲明), copy() (深拷貝)。
    • 簡潔性: data class User(val name: String, val age: Int) 一行搞定所有樣板。
  • 密封類 (Sealed Classes) - sealed class:
    • 核心: 定義一個受限的類層次結構。所有直接子類必須在同一個文件中聲明(Kotlin 1.1 后允許在同一個編譯單元的不同文件)。
    • 用途: 完美表達受限的繼承關系(如狀態、操作結果、表達式節點),是枚舉類的增強版(每個子類可以有多個實例和不同的狀態)。
    • when 配合: 編譯器可以檢查 when 表達式是否覆蓋了所有密封類的子類,無需 else 分支(確保編譯期安全)。
      sealed class Result
      data class Success(val data: T) : Result()
      data class Error(val exception: Exception) : Result()
      fun handle(result: Result) = when (result) {is Success -> ...is Error -> ...
      } // 編譯器知道所有情況已覆蓋
      
  • 對象聲明與伴生對象:
    • 對象聲明 (Object Declaration): object Singleton { ... }。創建單例。線程安全。
    • 伴生對象 (Companion Object): class MyClass { companion object { ... } }。相當于類級別的靜態成員(屬性、方法)的容器。可以命名 (companion object Factory) 和實現接口。
    • 替代靜態: Kotlin 沒有 static 關鍵字,伴生對象和頂層函數/屬性是其替代方案。
  • 委托 (Delegation):
    • 類委托 (by): class Derived(b: Base) : Base by b。將 DerivedBase 接口的實現委托給對象 b。減少繼承時的樣板代碼。
    • 屬性委托 (by): val/var property: Type by delegate。將屬性的訪問邏輯(getValue/setValue)委托給一個委托對象。
      • 標準委托:
        • lazy: 惰性初始化。
        • observable: 屬性變化時觸發回調。
        • vetoable: 屬性變化前進行校驗。
        • map: 將屬性存儲在 Map 中。
      • 強大靈活: 實現自定義屬性行為(如日志、驗證、依賴注入)。

5. 控制流與表達式

  • when 表達式:
    • 強大的 switch/case 替代品。
    • 可以作為表達式返回結果:val description = when (number) { 1 -> "One" else -> "Unknown" }
    • 支持多種匹配條件:常量、范圍 (in 1..10)、類型 (is String)、函數、任意表達式。
    • 與密封類配合實現編譯期安全。
  • 智能轉換 (Smart Casts):
    • 編譯器在特定上下文(如 if (obj is String) 之后)自動將變量轉換為更具體的類型,無需顯式強制轉換 (as String)。
    • 適用于 is 檢查后的代碼塊以及 &&/|| 之后的表達式。
    • 提高代碼簡潔性和安全性(減少 ClassCastException 風險)。
  • 范圍表達式 (.., downTo, step, until):
    • for (i in 1..10), for (i in 10 downTo 1 step 2), for (i in 0 until size)
    • 簡潔地表達迭代范圍。
    • 基于 rangeTo(), downTo(), step(), until() 操作符函數實現。
  • 解構聲明 (Destructuring Declarations):
    • 將對象(如數據類、Pair、Triple、Map.Entry)的屬性解構到多個變量中。
    • val (name, age) = person (要求 personcomponent1(), component2() 函數,數據類自動生成)。
    • for 循環中特別有用:for ((key, value) in map) { ... }
    • 簡潔地訪問多個值。

6. 協程 (Coroutines) - 異步/并發利器

  • 核心概念: 輕量級線程。由 Kotlin 庫管理(而非操作系統),在用戶態進行調度。掛起時幾乎不消耗資源。
  • 掛起函數 (suspend fun):
    • 標記一個函數可以在不阻塞線程的情況下被掛起(暫停執行)并在稍后恢復。
    • 掛起點通常發生在調用另一個 suspend fun 或使用協程構建器(如 delay, withContext)時。
  • 協程構建器:
    • launch: 啟動一個不返回結果的協程(通常用于“發后即忘”的任務)。
    • async: 啟動一個返回 Deferred (類似 Future) 的協程,可通過 await() 獲取結果。常用于并發計算。
    • runBlocking: 阻塞當前線程直到其內部協程執行完畢(主要用于測試和 main 函數)。
  • 協程上下文 (CoroutineContext):
    • 包含協程執行所需的各種元素,最主要的是 調度器 (CoroutineDispatcher)
    • 調度器: 決定協程在哪個或哪些線程上執行。
      • Dispatchers.Default: CPU 密集型任務(線程池)。
      • Dispatchers.IO: I/O 密集型任務(線程池)。
      • Dispatchers.Main: Android/JavaFX/Swing 主線程。
      • Dispatchers.Unconfined: 不指定線程(謹慎使用)。
  • 結構化并發 (Structured Concurrency):
    • 核心思想: 協程的生命周期被限定在一個特定的作用域 (CoroutineScope) 內(如 viewModelScope, lifecycleScope)。
    • 優勢:
      • 避免協程泄漏(忘記取消)。
      • 自動取消:父協程取消時,所有子協程自動取消。
      • 錯誤傳播:子協程失敗時,異常會傳播到父協程。
    • 關鍵: CoroutineScope 管理其內部啟動的所有協程。
  • withContext:
    • 用于在協程內部切換執行的上下文(主要是切換線程)。
    • suspend fun fetchData() = withContext(Dispatchers.IO) { ... // 網絡請求 }。完成后自動切回調用它的上下文。
  • Flow:
    • 冷異步流(Cold Asynchronous Stream)。按需(被收集時)產生多個值。
    • 類似 RxJava 的 Observable 或 Reactor 的 Flux,但更輕量級、與協程深度集成。
    • 操作符:map, filter, transform, zip, combine, flatMapMerge, flatMapConcat, flatMapLatest, catch, onCompletion 等。
    • 支持背壓(Backpressure)管理。
  • 深度價值:
    • 簡化異步代碼: 用看似同步的代碼 (suspend fun, await()) 編寫異步邏輯,告別回調地獄 (Callback Hell) 和復雜的 Future/Promise 鏈。
    • 高效并發: 輕量級,可創建數千甚至數萬個協程而不會導致線程資源耗盡。
    • 資源管理: 結構化并發簡化了協程生命周期的管理。
    • 統一模型: 為各種異步操作(網絡、數據庫、UI 更新、定時任務)提供一致的編程模型。

7. 其他關鍵特性與語法糖

  • 字符串模板: "Hello, $name! Value is ${value * 2}"。直接在字符串中嵌入變量或表達式。
  • 區間與級聯 (.., downTo, step, until): 如前所述。
  • 操作符重載: 允許為自定義類型定義如 +, -, *, /, [], in 等操作符的行為 (operator fun plus(other: MyType): MyType)。
  • 中綴函數 (infix fun): obj functionName param。使某些函數調用更接近自然語言(如 test shouldBe true - 需要自定義 infix fun T.shouldBe(other: T))。
  • 具名參數與默認參數:
    • fun drawCircle(x: Int = 0, y: Int = 0, radius: Int = 10)
    • 調用:drawCircle(radius = 20)。提高可讀性和靈活性,減少重載函數數量。
  • 解構聲明: 如前所述。
  • 類型檢查與轉換 (is, as, as?): 如前所述。
  • 集合字面量 (通過庫函數): listOf(1, 2, 3), mutableListOf(), setOf(), mapOf("key" to value)。簡潔創建集合。
  • JvmOverloads: 為具有默認參數的 Kotlin 函數生成多個重載的 JVM 方法,方便 Java 調用。
  • JvmStatic / JvmField: 控制 Kotlin 成員在 JVM 字節碼中的生成方式(靜態成員、公開字段)。

8. 工具鏈與生態

  • Kotlin/JVM: 主要目標平臺,編譯為 JVM 字節碼。
  • Kotlin/JS: 編譯為 JavaScript。
  • Kotlin/Native: 編譯為原生機器碼(無虛擬機),支持 iOS、macOS、Windows、Linux、嵌入式等。
  • Kotlin Multiplatform Mobile (KMM): 使用 Kotlin 共享業務邏輯代碼(非 UI)到 Android 和 iOS 平臺。
  • 編譯器: 高效,支持增量編譯。
  • 構建工具: Gradle (首選)、Maven 支持完善。
  • IDE: IntelliJ IDEA (原生一流支持),Android Studio (基于 IntelliJ,支持極佳),VS Code (通過插件提供良好支持)。
  • 豐富庫生態: Kotlin 標準庫 (kotlin-stdlib) 強大;Android KTX 提供 Android 開發擴展;ktor (網絡框架);Kotlinx 系列庫 (kotlinx.coroutines, kotlinx.serialization 等);大量優秀的第三方庫。

總結:Kotlin 的優勢與適用場景

  • 核心優勢:
    • 空安全: 顯著提升代碼健壯性。
    • 簡潔性: 大幅減少樣板代碼,提高開發效率和代碼可讀性。
    • 互操作性: 無縫融入 Java 生態,遷移成本低。
    • 函數式支持: 提供強大的現代編程范式工具。
    • 擴展函數/屬性: 優雅地擴展 API,構建 DSL。
    • 協程: 革命性地簡化異步和并發編程。
    • 工具鏈: 一流的 IDE 支持和構建工具集成。
  • 主要應用場景:
    • Android 開發: Google 官方推薦首選語言。
    • 后端開發 (Spring Boot, Ktor, Micronaut, Quarkus 等): 利用簡潔、安全和協程優勢。
    • 多平臺開發 (KMM): 共享業務邏輯到 iOS 和 Android。
    • 腳本: Kotlin Script (*.kts) 用于 Gradle 構建腳本或其他自動化任務。
    • 原生開發 (Kotlin/Native): iOS、桌面應用、嵌入式系統等。
    • 全棧開發: Kotlin/JVM 后端 + Kotlin/JS 前端。

Kotlin 的設計在簡潔性、安全性、表達力和實用性之間取得了極佳的平衡。它既是一門強大的工業級語言,也提供了令人愉悅的編程體驗。其持續的發展和活躍的社區確保了它在現代軟件開發中的重要地位。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91474.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91474.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91474.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二進制數本身沒有默認的有符號或無符號解釋

文章目錄1. ?**?硬件層面&#xff1a;CPU 不區分有符號/無符號?**?2. ?**?解釋權在程序員手中?**?3. ?**?默認傾向性&#xff08;非絕對規則&#xff09;?**?4. ?**?如何避免混淆&#xff1f;?**?5. ?**?經典示例?**?總結1. **解釋為無符號數&#xff08;U…

(AI) Server (Hardware) Architecture

Overview by Atlas T800 Just found a good product demo. from Huawei for its Atlas T800, here 計算產品3D展示 First turn off all modules and we can delve into how this server is organized. Core This is an AI server with 910B as its main feature, which is …

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博評論數據可視化分析-用戶評論詞云圖實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解微博評論數據可視化分析-用戶評論詞云圖實現…

【Linux學習|黑馬筆記|Day1】Linux初識、安裝VMware Workstation、安裝CentOS7、遠程連接、虛擬機快照

Linux DAY1 前言 因為之前MySQL學到安裝Linux版本的MySQL了&#xff0c;需要安裝虛擬機等等&#xff0c;所以我打算先學完Linux的全部課程&#xff0c;期間繼續學MySQL 文章目錄Linux DAY1一.1&#xff09;操作系統概述2&#xff09;Linux初識3&#xff09;虛擬機4.1&#xff…

編程與數學 03-002 計算機網絡 13_無線網絡技術

編程與數學 03-002 計算機網絡 13_無線網絡技術一、無線網絡的基本概念&#xff08;一&#xff09;無線通信的頻段與標準&#xff08;二&#xff09;無線網絡的優勢與挑戰二、無線局域網&#xff08;WLAN&#xff09;&#xff08;一&#xff09;802.11標準系列&#xff08;二&a…

肖特基二極管MBR0540T1G 安森美ON 低電壓 高頻率 集成電路IC 芯片

MBR0540T1G ON Semiconductor&#xff1a;超低VF肖特基二極管&#xff0c;重新定義電源效率&#xff01;&#x1f525; 一、產品簡介 MBR0540T1G 是安森美&#xff08;ON Semiconductor&#xff09;推出的0.5A/40V肖特基勢壘二極管&#xff0c;采用專利溝槽結構&#xff0c;專…

windows內核研究(軟件調試-調試事件采集)

軟件調試調試事件采集前面有說到在調試器和被調試之間會創建一個_DEBUG_OBJECT對象來進行關聯調試事件的種類 被調試進程會把一個個的調試事件寫到_DEBUG_OBJECT中的一個成員鏈表中&#xff0c;調試器就通過它們建立的 _DEBUG_OBJECT調試對象獲取調式事件&#xff0c;但并不是進…

Web開發-PHP應用組件框架前端模版渲染三方插件富文本編輯器CVE審計

類別組件/框架說明[Web框架]Laravel現代化、功能全面的框架&#xff0c;適合大多數Web應用。Symfony高度模塊化、功能強大的框架&#xff0c;適合復雜應用。CodeIgniter輕量級框架&#xff0c;適合快速開發。Zend Framework (Laminas)企業級框架&#xff0c;適合大規模應用&…

Spring Boot Actuator 保姆級教程

1. 引言 Spring Boot Actuator 是一個功能強大的監控工具&#xff0c;能夠幫助開發者監控和管理應用的運行狀態。通過 Actuator&#xff0c;我們可以輕松獲取應用的健康狀況、配置信息、性能指標等。本文將一步步引導你如何配置和使用 Actuator&#xff0c;以及如何通過它來監控…

使用 whisper, 音頻分割, 初步嘗試,切割為小塊,效果還不錯 1

對于一首歌而言,如何斷句?即,一個 mp4 或是 mp3 文件,或是一段錄音, 如何使用程序,或是 ai 來斷句。分割為一句一句的片段??如果人工來分割,一般是使用 capcut 之類的剪輯軟件。但是效率太慢了。所以我想能否設計一個簡潔的,自動的程序來處理。這種事情,專業的名稱…

AD2S1210的DOS LOT含義

一、??信號質量監控類寄存器????LOT閾值&#xff08;0x88&#xff09;????作用??&#xff1a;設定信號丟失&#xff08;Loss of Signal&#xff09;的判定門檻。??場景??&#xff1a;當正弦或余弦輸入信號幅值低于此值時&#xff0c;芯片認為信號丟失&#xff…

Au速成班-多軌編輯流程

基礎編輯工作流&#xff0c;包含文件導入&#xff0c;導出&#xff0c;音量調節&#xff0c;部分效果添加。 創建多軌會話 設置工程文件名稱、文件位置、采樣率、位深度、主控等。 界面管理 &#xff0c;界面說明詳細可看 Au速成班-基礎篇_au界面介紹-CSDN博客 音量調節點擊…

Rust實現GPU驅動的2D渲染引擎

當傳統CPU渲染遭遇性能瓶頸時&#xff0c;GPU驅動的架構正在革新2D圖形領域。本文將深入解析用Rust編寫的??完全GPU驅動的2D渲染引擎Vello??&#xff0c;揭秘其如何通過并行計算實現絲滑渲染。 一、GPU Driven革命&#xff1a;為何是Vello&#xff1f; 傳統渲染的瓶頸 傳…

【ELasticsearch】溫、冷數據節點能是同一個節點嗎

溫、冷數據節點能是同一個節點嗎1.節點角色與分層存儲原理2.一個節點能否同時是 “溫” 和 “冷” 節點 &#xff1f;3.為什么通常不是最佳實踐 &#xff1f;4.可能的適用場景&#xff08;非常有限&#xff09;5.結論在 Elasticsearch 中&#xff0c;理論上&#xff0c;一個物理…

報錯:selenium.common.exceptions.ElementNotInteractableException: Message

針對該錯誤&#xff0c;以下是分步解決方案&#xff1a; 1. 顯式等待確保元素可交互 from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC# 等待元素可點…

sqli-labs:Less-10關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $id ".$id."; $sql"SELECT * FROM users WHERE id$id LIMIT 0,1";注入類型&#xff1a;字符串型&#xff08;雙引號包裹&#xff09;提示&#xff1a;參數id需以"閉合 php回顯輸出語句的代碼如…

imx6ull-驅動開發篇5——新字符設備驅動實驗

目錄 前言 新字符設備驅動原理 申請設備號 注冊設備號 釋放設備號 注冊方法 字符設備結構cdev cdev_init 函數 cdev_add 函數 cdev_del 函數 自動創建設備節點 mdev 機制 類創建函數 類刪除函數 創建設備函數 刪除設備函數 設置文件私有數據 實驗程序編寫 l…

2025年最新SCI-灰熊增脂優化器(Grizzly Bear Fat Increase, GBF)-附完整Matlab免費代碼

1、簡介 本文介紹了一種新的受自然啟發的優化算法&#xff0c;稱為灰熊增脂優化器&#xff08;GBFIO&#xff09;。GBFIO算法模仿灰熊積累體脂為過冬做準備的自然行為&#xff0c;利用它們的狩獵、捕魚和吃草、蜂蜜等策略。因此&#xff0c;GBFIO算法建模并考慮了三個數學步驟來…

Python爬蟲02_Requests實戰網頁采集器

一、Request請求偽裝解析 #UA&#xff1a;User-Agent&#xff08;請求載體身份標識&#xff09; #UA檢測&#xff1a;門戶網站的服務器會檢測對應請求的載體身份標識&#xff0c;如果檢測到請求的載體身份呢標識為某一款瀏覽器&#xff0c;說明該請求是一個正常的請求&#xff…

vue+elementui實現問卷調查配置可單選、多選、解答

效果&#xff1a;<template> <div><el-form :inline"true" :model"form" :rules"rules" ref"ruleForm"> <el-tabs type"border-card" v-model"cardType"><el-tab-pane name"1&qu…