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.mzph.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. 辅助功能函数堆的判空获取堆顶元…