如何在多个编程语言间切换自如

目录

基本思路

  1. 基本结构和控制流要记住,也就是熟悉基本语法
  2. 识别各自语言的特性,也就是知道高级特性

本文主要是熟悉基本语法,搞清楚不同的编程语言怎么描述相同的功能的。对于高级特性,点到为止。

语法简介

语法特性PythonGo
变量声明动态类型,无需声明静态类型,必须声明
代码块缩进(空格/制表符){} 包裹
循环for、while只有 for
函数def,支持默认参数func,无默认参数
错误处理try-except返回 error + if err != nil
并发threading(GIL 限制)goroutine + channel
面向对象完整类继承struct + interface
包管理pip + importgo mod + import

内置函数

Python 的内置函数更丰富,适合快速开发;Go 的内置函数较少,但更专注于底层控制和性能优化。

类别PythonGo
输入输出print(), input()fmt.Println(), fmt.Scan()
类型转换int(), str()strconv.Atoi(), string()
集合操作len(), sorted(), map()len(), append(), make()
并发threading(非内置)go, chan, close()
错误处理try/except(语法)panic(), recover()

Go

  1. 内存分配:new(), make()
  2. 类型转换:int(), float64(), string()
  3. 集合操作:len(), cap(), append()
  4. 并发:go, close()
  5. 错误处理:panic(), recover()

Python

  1. 输入输出:print(), input()
  2. 类型转换:int(), float(), str(), bool()
  3. 数学运算:abs(), round(), min(), max(), sum()
  4. 迭代与序列操作:len(), range(), sorted(), enumerate()
  5. 对象操作:type(), isinstance(), dir()
  6. 高阶函数:map(), filter(), zip()

控制流

循环

Go
/* Go 只有 for 循环 */

for i, val := range arr {
  // ...
}

for i := 0; i < len(arr); i++ {
  // ...
}
Python
for i in range(10):
  pass

for i in range(0, 10, 1):
  pass

for val in arr:
  pass

for i, val in enumerate(arr):
  pass
else
  pass

while len(queue) > 0:
  pass
else
  pass

while flag: print(str(flag))

数据结构

Go

stack := make([]string, 0, 10)

// 入栈
stack = append(stack, "A")

// 出栈
v := stack[len(stack)-1]
stack = stack[:len(stack)-1]

// 判断是否为空
isEmpty := len(stack) == 0

Python

L = []

L.append('D')  # 入栈

L.pop()  # 出栈
L[-1]  # peek

队列

Go

queue := make([]int, 0)

// 入队
queue = append(queue, 10)

// 出队
v := queue[0]
queue = queue[1:]

// 判断是否为空
isEmpty := len(queue) == 0

Python

L = []

L.append('D')  # 入队

L.pop(0)  # 出队
L[0]  # peek
  • collections.deque 是个高效的双端队列,具有 popleft() append() 方法。

集合

集合(set)是一个无序的不重复元素序列。

如果从广义上来看的话,数组、字典、元组、栈、队列等都是集合。

Go

无原生 Set,通常用 map[T]boolmap[T]struct{} 模拟。一般还会封装成一个结构体。

// 初始化一个 set(用 map[string]bool 模拟)
set := make(map[string]bool)

// 添加元素
set["apple"] = true
set["banana"] = true

// 检查元素是否存在
if set["apple"] {
    fmt.Println("apple exists") // 输出: apple exists
}

if _, ok := set["apple"]; ok {
  // 当使用 map[string]struct{} 时更省内存(struct{} 是零大小类型)
    fmt.Println("apple exists") // 输出: apple exists
}

// 删除元素
delete(set, "banana")

// 遍历集合
for key := range set {
    fmt.Println(key) // 输出: apple
}

Python

set1 = {1, 2, 3, 4}            # 直接使用大括号创建集合; 创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典
set2 = set([4, 5, 6, 7])      # 使用 set() 函数从列表创建集合

set2.add(8)  # 将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作
set2.update([9,10])  # 参数可以是列表,元组,字典等

set2.remove(8)  # 将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误
set2.discard(8)  # 移除集合中的元素,且如果元素不存在,不会发生错误
set2.pop()  # 随机删除集合中的一个元素
set2.clear()  # 清空集合

x in s  # 判断元素 x 是否在集合 s 中,存在返回 True,不存在返回 False
len(s)  # 计算集合 s 元素个数
标签 :
comments powered by Disqus

相关文章

MacBook 上安装 ArchLinux 双系统

动机 希望将闲置的 2018 款 MBP 利用起来,整成一台 Linux 服务器就好了,因为 macOS 上的 Docker 非常难用,再加上我比较爱折腾,于是有了这个想法。 主要参考这个 wiki:https://wiki.t2linux.org Tip

阅读更多
Snapcast 多房间音频控制一体化

动机 想要手头的两台 MBP 能同时无延迟播放音频,拒绝使用直播流的形式。 Tip update at 2025-04-13

阅读更多
beancount-gs 一款 self-hosted 复式记账程序,简化你的记账方式!

本程序将部署在 macOS 上,不使用 Docker(mac 上的 Docker 太卡了) 动机 我利用 beancount 来记账已经有一段时间了,但有些痛点问题困扰着我: 没有 web 界面,fava 真的只能用来展示和分析且不好理解,需要有一个方便记账的界面 text 记账的方式,在 vscode 插件能力有限的情况下,很容易忘记 assets 和 expenses 到底叫啥名,如果有 web 界面那么一定会好很多,一个下拉列表就可以解决 有没有解决方案,不需要自己造轮子的那种?

阅读更多