Dart和Go語言特征對比

文章目錄

  • Dart 和 Go 語法對照表
    • 字符串常用方法對照
    • 列表(數組/切片)常用方法對照
    • Map (字典/哈希表) 使用對照
    • IO 操作對照
      • 文件操作
      • 標準輸入輸出
      • 網絡IO
  • 主要差異說明

有同事說,我前端用Flutter,后端用Golang,都師出名門。但兩個語言還是老打架,總不能芝麻蒜皮的事情都請教AI吧。腦子里多多少少還是裝點東西比較好。

Dart 和 Go 語法對照表

以下是 Dart 和 Go 語言在主要語法要素上的對比:

語法要素Dart 語法Go 語法
基本數據類型
整數int (64位)int, int8, int16, int32, int64
浮點數doublefloat32, float64
布爾值boolbool
字符串Stringstring
動態類型dynamic, var, Objectinterface{} (Go 1.18+ 可用 any)
變量定義
顯式類型聲明int x = 10;var x int = 10x := 10
類型推斷var x = 10;final x = 10;x := 10
常量const x = 10;final x = 10;const x = 10
函數定義
基本函數int add(int a, int b) { return a + b; }func add(a int, b int) int { return a + b }
匿名函數(a, b) => a + b;func(a, b int) int { return a + b }
類定義
類聲明class Person { ... }type Person struct { ... }
構造函數Person(this.name, this.age);Go 沒有構造函數,通常用 NewPerson() 函數
方法定義void sayHello() { print('Hello'); }func (p Person) SayHello() { fmt.Println("Hello") }
繼承/接口class Student extends Person implements Learner { ... }Go 使用組合和接口: type Student struct { Person } + type Learner interface { ... }
控制結構
if 語句if (x > 0) { ... } else { ... }if x > 0 { ... } else { ... }
for 循環for (var i = 0; i < 10; i++) { ... }for i := 0; i < 10; i++ { ... }
while 循環while (x > 0) { ... }for x > 0 { ... }
range 循環for (var item in list) { ... }for index, item := range list { ... }
switch 語句switch (x) { case 1: ... default: ... }switch x { case 1: ... default: ... }
集合類型
數組/切片List<int> list = [1, 2, 3];slice := []int{1, 2, 3}
字典Map<String, int> map = {'a': 1, 'b': 2};map := map[string]int{"a": 1, "b": 2}
錯誤處理try { ... } catch (e) { ... }result, err := someFunc(); if err != nil { ... }
并發Future, async/await, Isolategoroutine, channel, sync
包/模塊管理import 'package:path/path.dart';import "path/to/package"
空安全有 (非空類型 String, 可空類型 String?)無 (但有 nil)

字符串常用方法對照

操作描述Dart 字符串方法Go 字符串方法
長度str.lengthlen(str)
是否為空str.isEmptystr.isNotEmptylen(str) == 0
拼接str1 + str2'$str1$str2'str1 + str2strings.Join([]string{str1, str2}, "")
分割str.split(',')strings.Split(str, ",")
子串str.substring(start, [end])str[start:end]
包含str.contains('substr')strings.Contains(str, "substr")
查找位置str.indexOf('substr')strings.Index(str, "substr")
大小寫轉換str.toUpperCase() / str.toLowerCase()strings.ToUpper(str) / strings.ToLower(str)
去除空格str.trim() / str.trimLeft() / str.trimRight()strings.TrimSpace(str) / strings.TrimLeft / strings.TrimRight
替換str.replaceAll('old', 'new')strings.ReplaceAll(str, "old", "new")
前綴/后綴檢查str.startsWith('prefix') / str.endsWith('suffix')strings.HasPrefix(str, "prefix") / strings.HasSuffix(str, "suffix")
重復str * n (如 'a' * 3 得到 'aaa')strings.Repeat(str, n)
格式化'Name: $name, Age: ${age}'fmt.Sprintf("Name: %s, Age: %d", name, age)
比較str1.compareTo(str2)strings.Compare(str1, str2)
UTF-8 操作str.runes (獲取 Unicode 碼點迭代器)[]rune(str) (轉換為 rune 切片)

列表(數組/切片)常用方法對照

操作描述Dart List 方法Go Slice/Array 方法
初始化var list = [1, 2, 3];List<int> list = [1, 2, 3];slice := []int{1, 2, 3}var array [3]int = [3]int{1, 2, 3}
長度list.lengthlen(slice)
是否為空list.isEmptylist.isNotEmptylen(slice) == 0
添加元素list.add(item)list.addAll([item1, item2])slice = append(slice, item)slice = append(slice, item1, item2)
插入元素list.insert(index, item)list.insertAll(index, [item1, item2])需手動實現: slice = append(slice[:i], append([]T{item}, slice[i:]...)...)
刪除元素list.remove(item)list.removeAt(index)slice = append(slice[:i], slice[i+1:]...)
清空list.clear()slice = slice[:0]
查找索引list.indexOf(item)需手動遍歷或使用 sort.Search (排序后)
包含檢查list.contains(item)需手動遍歷
排序list.sort()list.sort((a, b) => a.compareTo(b))sort.Slice(slice, func(i, j int) bool { return slice[i] < slice[j] })
反轉list.reversed.toList()需手動實現或使用 sort.Reverse
切片/子列表list.sublist(start, [end])slice[start:end]
連接列表list1 + list2[...list1, ...list2]append(list1, list2...)
映射list.map((item) => item * 2).toList()需手動遍歷或使用泛型函數
過濾list.where((item) => item > 2).toList()需手動遍歷過濾
遍歷list.forEach((item) { ... })for index, item := range slice { ... }
折疊/歸約list.fold(initial, (prev, item) => prev + item)需手動遍歷實現
元素檢查list.every((item) => item > 0) / list.any((item) => item > 0)需手動遍歷實現
去重list.toSet().toList()需手動實現(使用 map)
填充List.filled(3, 0)需手動初始化
生成范圍列表List.generate(5, (index) => index * 2)需手動實現

Map (字典/哈希表) 使用對照

操作描述Dart Map 用法Go Map 用法
初始化var map = {'a': 1, 'b': 2};
Map<String, int> map = {'a': 1, 'b': 2};
m := map[string]int{"a": 1, "b": 2}
新建空Mapvar map = {};
Map<String, int> map = {};
m := make(map[string]int)
添加/更新元素map['key'] = valuem["key"] = value
獲取元素var value = map['key']; (不存在返回null)value := m["key"] (不存在返回零值)
value, exists := m["key"]
刪除元素map.remove('key');delete(m, "key")
檢查鍵是否存在map.containsKey('key')_, exists := m["key"]
長度map.lengthlen(m)
是否為空map.isEmpty / map.isNotEmptylen(m) == 0
遍歷map.forEach((k, v) { ... });
for (var k in map.keys) { ... }
for k, v := range m { ... }
獲取所有鍵map.keys.toList()需手動收集:
keys := make([]string, 0, len(m))
for k := range m { keys = append(keys, k) }
獲取所有值map.values.toList()類似獲取鍵的方式
合并Map{...map1, ...map2}
map1.addAll(map2)
需手動遍歷實現
清空Mapmap.clear()需重新make或遍歷delete
不可變MapMap.unmodifiable({'a': 1})無內置支持,需自定義實現

IO 操作對照

文件操作

操作描述Dart 文件操作Go 文件操作
讀取整個文件dart<br>var content = await File('path.txt').readAsString();<br>go<br>data, err := os.ReadFile("path.txt")<br>
逐行讀取dart<br>var lines = await File('path.txt').readAsLines();<br>go<br>file, _ := os.Open("path.txt")<br>scanner := bufio.NewScanner(file)<br>for scanner.Scan() { line := scanner.Text() }<br>
寫入文件dart<br>await File('path.txt').writeAsString('content');<br>go<br>err := os.WriteFile("path.txt", []byte("content"), 0644)<br>
追加寫入dart<br>var file = await File('path.txt').open(mode: FileMode.append);<br>await file.writeString('content');<br>go<br>file, _ := os.OpenFile("path.txt", os.O_APPEND|os.O_WRONLY, 0644)<br>file.WriteString("content")<br>
檢查文件是否存在dart<br>var exists = await File('path.txt').exists();<br>go<br>_, err := os.Stat("path.txt")<br>exists := !os.IsNotExist(err)<br>
刪除文件dart<br>await File('path.txt').delete();<br>go<br>err := os.Remove("path.txt")<br>
目錄操作dart<br>var dir = Directory('path');<br>await dir.create();<br>var list = dir.list();<br>go<br>os.Mkdir("path", 0755)<br>files, _ := os.ReadDir("path")<br>

標準輸入輸出

操作描述Dart 標準IOGo 標準IO
打印輸出print('Hello');
stdout.writeln('Hello');
fmt.Print("Hello")
fmt.Println("Hello")
格式化輸出print('Name: $name, Age: $age');fmt.Printf("Name: %s, Age: %d", name, age)
讀取輸入dart<br>var input = stdin.readLineSync();<br>go<br>var input string<br>fmt.Scanln(&input)<br>
讀取數字輸入dart<br>var num = int.parse(stdin.readLineSync()!);<br>go<br>var num int<br>fmt.Scanf("%d", &num)<br>

網絡IO

操作描述Dart 網絡IOGo 網絡IO
HTTP GET請求dart<br>var response = await http.get(Uri.parse('https://example.com'));<br>var body = response.body;<br>go<br>resp, _ := http.Get("https://example.com")<br>body, _ := io.ReadAll(resp.Body)<br>
HTTP POST請求dart<br>var response = await http.post(<br> Uri.parse('https://example.com'),<br> body: {'key': 'value'}<br>);<br>go<br>resp, _ := http.PostForm("https://example.com", url.Values{"key": {"value"}})<br>
創建HTTP服務器dart<br>var server = await HttpServer.bind('localhost', 8080);<br>await for (var request in server) {<br> request.response.write('Hello');<br> await request.response.close();<br>}<br>go<br>http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {<br> fmt.Fprint(w, "Hello")<br>})<br>http.ListenAndServe(":8080", nil)<br>

主要差異說明

  1. 類型系統:

    • Dart 是面向對象的語言,支持類和繼承
    • Go 是面向接口的語言,使用組合而非繼承
  2. 并發模型:

    • Dart 使用 async/awaitIsolate
    • Go 使用 goroutinechannel
  3. 錯誤處理:

    • Dart 使用異常機制 (try/catch)
    • Go 使用顯式錯誤返回值
  4. 構造函數:

    • Dart 有專門的構造函數語法
    • Go 通常使用工廠函數 (如 NewPerson()) 來創建結構體實例
  5. 泛型:

    • Dart 2.0+ 支持泛型
    • Go 1.18+ 支持泛型
  6. 空安全:

    • Dart 2.12+ 有健全的空安全
    • Go 沒有內置的空安全機制
  7. 語法風格:

    • Dart 使用分號和大括號,類似 Java/JavaScript
    • Go 也使用大括號,但可以省略分號,語法更簡潔
  8. 字符串處理:

    • Dart 的字符串方法是內置的成員方法
    • Go 的字符串操作大多在 strings 包中提供
  9. 列表/切片操作:

    • Dart 的 List 提供了豐富的高階方法(map/filter/reduce等)
    • Go 的切片操作更底層,許多功能需要手動實現或使用標準庫
  10. 不可變性:

    • Dart 有不可變列表: List.unmodifiable()
    • Go 的切片總是可變的
  11. 泛型支持:

    • Dart 2.0+ 全面支持泛型,列表方法可以類型安全地使用
    • Go 1.18+ 支持泛型,但標準庫的許多方法還未完全適配
  12. 鏈式調用:

    • Dart 支持方法鏈式調用(如 list.map(...).where(...).toList())
    • Go 通常需要分步操作或自定義函數

這個對照表涵蓋了兩1. Map 差異:

  • Dart 的 Map 是泛型類,有豐富的內置方法
  • Go 的 map 是內置類型,操作更基礎,部分功能需手動實現
  • Go 的 map 值訪問會返回零值,Dart 返回 null
  1. IO 差異:

    • Dart 的 IO 操作通常是異步的(使用 Future/await)
    • Go 的 IO 操作通常是同步的,但可以通過 goroutine 實現并發
    • Dart 的 core 庫包含基本 IO,網絡需要 http 包
    • Go 的 IO 操作分散在 os, io, bufio, net/http 等包中
  2. 錯誤處理:

    • Dart 使用 try-catch 處理異常
    • Go 使用多返回值模式(error 值)
  3. 文件路徑:

    • Dart 可以使用 path 包處理跨平臺路徑
    • Go 的 path/filepath 包提供類似功能
  4. 流處理:

    • Dart 有 Stream 和 StreamTransformer 支持
    • Go 使用 io.Reader 和 io.Writer 接口

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

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

相關文章

ActiveMQ 集群搭建與高可用方案設計(二)

五、高可用方案設計與優化 &#xff08;一&#xff09;Zookeeper 在 ActiveMQ 集群中的應用 作用&#xff1a;在 ActiveMQ 集群中&#xff0c;Zookeeper 扮演著至關重要的角色。它主要用于選舉 Master 節點&#xff0c;通過其內部的選舉機制&#xff0c;從眾多的 ActiveMQ Br…

【項目歸檔】數據抓取+GenAI+數據分析

年后這兩個月頻繁組織架構變動&#xff0c;所以博客很久沒更新。現在暫時算是塵埃落定&#xff0c;趁這段時間整理一下。 入職九個月&#xff0c;自己參與的項目有4個&#xff0c;負責前后端開發&#xff0c;測試&#xff0c;devops&#xff08;全棧/doge&#xff09;&#xff…

服務器熱備份,服務器熱備份的方法有哪些?

服務器熱備份是保障業務連續性的重要技術手段&#xff0c;通過實時數據同步和快速故障切換&#xff0c;確保在主服務器故障時備份服務器能無縫接管。以下是常見的服務器熱備份方法及其核心要點&#xff1a; 雙機熱備&#xff08;Active-Standby/Active-Active&#xff09; 主備…

【AI平臺】n8n入門6:調用MCP服務(非社區節點)

前言 前邊用n8n搭建一個MCP服務&#xff0c;現在&#xff0c;用n8n調用其他服務商提供的MCP服務。本文以高德地圖服務為例&#xff0c;記錄一下操作過程。 實現案例功能 MCP是啥 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文協議&#xff09;是由Anthropi…

基于ArduinoIDE的任意型號單片機 + GPS北斗BDS衛星定位

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言1.1 器件選擇1.2 接線方案 二、驅動實現2.1 核心代碼解析&#xff08;arduino/ESP32-S3&#xff09; 三、坐標解析代碼四、典型問題排查總結 前言 北斗衛星導航…

經典算法 最小生成樹(prim算法)

最小生成樹 題目描述 給定一個 n 個點 m 條邊的無向圖&#xff0c;圖中可能存在重邊和自環&#xff0c;邊權可能為負數。 求最小生成樹的樹邊權重之和。如果最小生成樹不存在&#xff0c;則輸出 impossible。 給定一張邊帶權的無向圖 G (V, E)&#xff0c;其中&#xff1a…

LeetCode算法題 (設計鏈表)Day16!!!C/C++

https://leetcode.cn/problems/design-linked-list/description/ 一、題目分析 你可以選擇使用單鏈表或者雙鏈表&#xff0c;設計并實現自己的鏈表。 單鏈表中的節點應該具備兩個屬性&#xff1a;val 和 next 。val 是當前節點的值&#xff0c;next 是指向下一個節點的指針/引…

《解鎖GCC版本升級:開啟編程新世界大門》

《解鎖GCC版本升級:開啟編程新世界大門》 一、引言:GCC 版本升級的魔法鑰匙 在編程的廣闊天地里,GCC(GNU Compiler Collection)宛如一座燈塔,為無數開發者照亮前行的道路。它是一款開源且功能強大的編譯器集合,支持 C、C++、Objective - C、Fortran、Ada 等多種編程語言…

toLua筆記

基本 LuaState luaStatenew LuaState(); luaState.Start(); luaState.DoString("xxx"); luaState.DoFile("yyy.lua"); luaState.Require("zzz");//不要加.lua后綴 luaState.CheckTop();//檢查解析器棧頂為空 luaState.Dispose(); luaStatenull;…

go實現雙向鏈表

需求 實現雙向鏈表的節點生成、正反向遍歷、指定刪除。 實現 package mainimport ("fmt" )type zodiac_sign struct {number intdizhi stringanimal stringyear intprevious *zodiac_signnext *zodiac_sign }// 添加 // func add_node_by_order(pr…

AI實踐指南:AGENT、RAG和MCP在Java中的簡單實現

在當今AI快速發展的時代&#xff0c;有幾個核心概念正在改變我們構建智能應用的方式。本文將用簡單易懂的語言介紹三個重要概念&#xff1a;AGENT&#xff08;AI代理&#xff09;、RAG&#xff08;檢索增強生成&#xff09;和MCP&#xff08;多通道感知&#xff09;&#xff0c…

解決VMware虛擬機能搜索到網頁但打不開的問題

&#x1f334; 問題描述 很奇怪&#xff0c;不知道為什么&#xff0c;我安裝的Windows 10虛擬機能在瀏覽器中搜索到網頁&#xff0c;但點擊具體的網頁鏈接就是死活不能加載出來&#xff0c;如下圖所示&#xff1a; 點擊第一個鏈接&#xff0c;加載了四五分鐘&#xff0c;結果就…

JVM性能調優的基礎知識 | JVM內部優化與運行時優化

目錄 JVM內部的優化邏輯 JVM的執行引擎 解釋執行器 即時編譯器 JVM采用哪種方式&#xff1f; 即時編譯器類型 JVM的分層編譯5大級別&#xff1a; 分層編譯級別&#xff1a; 熱點代碼&#xff1a; 如何找到熱點代碼&#xff1f; java兩大計數器&#xff1a; OSR 編譯…

什么是多租戶系統

隨著云計算和 SaaS&#xff08;Software as a Service&#xff09;模式的普及&#xff0c;多租戶架構&#xff08;Multi-Tenant Architecture&#xff09;成為 SaaS 產品設計中的核心模式之一。多租戶架構允許多個用戶&#xff08;租戶&#xff09;共享同一套基礎設施和應用&am…

多線程系列三:這就是線程的狀態?

1.認識線程的狀態 NEW&#xff1a;Thread對象已經創建好了&#xff0c;但還沒有調用start方法在系統中創建線程 RUNNABLE&#xff1a;就緒狀態&#xff0c;表示這個線程正在CPU上執行&#xff0c;或準備就緒&#xff0c;隨時可以去CPU上執行 BLOCKED&#xff1a;表示由于鎖競爭…

【C語言練習】019. 使用結構體數組存儲復雜數據

019. 使用結構體數組存儲復雜數據 019. 使用結構體數組存儲復雜數據示例1&#xff1a;定義一個結構體并創建結構體數組定義結構體創建并初始化結構體數組輸出結果 示例2&#xff1a;動態輸入數據到結構體數組定義結構體動態輸入數據示例輸入和輸出 示例3&#xff1a;使用結構體…

**Java面試大冒險:謝飛機的幽默與技術碰撞記**

互聯網大廠Java求職者面試&#xff1a;一場嚴肅與搞笑交織的技術盛宴 場景&#xff1a; 互聯網大廠面試間 人物&#xff1a; 面試官&#xff1a; 一位嚴肅的資深架構師&#xff0c;對技術要求嚴格。謝飛機&#xff1a; 一位搞笑的程序員&#xff0c;技術實力參差不齊。 第一…

MySQL進階(三)

五、鎖 1. 概述 鎖是計算機協調多個進程或線程并發訪問某一資源的機制&#xff08;避免爭搶&#xff09;。 在數據庫中&#xff0c;除傳統的計算資源&#xff08;如 CPU、RAM、I/O 等&#xff09;的爭用以外&#xff0c;數據也是一種供許多用戶共享的資源。如何保證數據并發…

【BLE】【nRF Connect】 精講nRF Connect自動化測試套件(宏錄制、XML腳本)

目錄 前言 1. nRF Connect自動化測試介紹 1.1. nRF connect宏錄制功能介紹 1.2. 電腦端XML方式 1.3 實際應用案例 1.3.1 BLE 穩定性測試 1.3.2 設備固件更新(DFU)測試 1.3.3 批量設備配置 1.4 操作步驟 1.5 注意事項 2. nRF Connect日志記錄 2.1. 日志記錄功能 …

【數據結構】堆的完整實現

堆的完整實現 堆的完整實現GitHub地址前言堆的核心功能實現重溫堆的定義堆結構定義1. 堆初始化與銷毀2. 元素交換函數3. 堆化操作向上調整&#xff08;子→父&#xff09;向下調整&#xff08;父→子&#xff09; 4. 堆元素插入5. 堆元素刪除6. 輔助功能函數堆的判空獲取堆頂元…