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

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 接口

相关文章:

  • KeyPresser 一款自动化按键工具
  • 用Suno V4.5试了一下1850字的歌词进行创作出来了6分钟的歌曲
  • 计算机视觉与深度学习 | 视觉里程计算法综述(传统+深度)
  • 计算机视觉与深度学习 | 什么是图像金字塔?
  • 聊一聊自然语言处理在人工智能领域中的应用
  • MCP 协议知识分享指南
  • Swift:重构开发范式的现代编程语言
  • 【原创】风云扫描王[特殊字符]OCR识别翻译!证件照
  • AWS上构建基于自然语言和LINDO API的线性规划与非线性规划的优化计算系统
  • 欧拉计划 Project Euler64(奇周期平方根)题解
  • 饱和蒸汽再生数据采集挥发性有机物(VOCs)吸附脱附实验装置
  • 跨语言信息捕手:基于HMM的多语言命名实体识别实战
  • 黑客学习计划
  • 2025年渗透测试面试题总结-拷打题库35(题目+回答)
  • Go语言的优势与应用场景 -《Go语言实战指南》
  • 基于Spring Boot实现STDIO通信的MCP Server与验证
  • INP指标
  • GESP2024年6月认证C++八级( 第三部分编程题(2)空间跳跃)
  • 经典算法 最小生成树(prim算法)
  • 复刻低成本机械臂 SO-ARM100 组装篇(打螺丝喽)
  • 海外考古大家访谈|斯文特·帕波:人类进化遗传学的奠基者
  • 最火“五一”预订!小长假前两日多地接待游客量两位数增长,出境游订单井喷
  • 人社部:一季度全国城镇新增就业308万人,同比增加5万人
  • 今年一季度全国社会物流总额达91万亿元,工业品比重超八成
  • 广西干旱程度有所缓解,未来一周旱情偏重地区降水量仍不足
  • 上海乐高乐园建设进入最后冲刺,开园限量纪念年卡将于5月开售