如何在多个编程语言间切换自如
目录
基本思路
- 基本结构和控制流要记住,也就是熟悉基本语法
- 识别各自语言的特性,也就是知道高级特性
本文主要是熟悉基本语法,搞清楚不同的编程语言怎么描述相同的功能的。对于高级特性,点到为止。
语法简介
语法特性 | Python | Go |
---|---|---|
变量声明 | 动态类型,无需声明 | 静态类型,必须声明 |
代码块 | 缩进(空格/制表符) | {} 包裹 |
循环 | for、while | 只有 for |
函数 | def,支持默认参数 | func,无默认参数 |
错误处理 | try-except | 返回 error + if err != nil |
并发 | threading(GIL 限制) | goroutine + channel |
面向对象 | 完整类继承 | struct + interface |
包管理 | pip + import | go mod + import |
内置函数
Python 的内置函数更丰富,适合快速开发;Go 的内置函数较少,但更专注于底层控制和性能优化。
类别 | Python | Go |
---|---|---|
输入输出 | 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
- 内存分配:new(), make()
- 类型转换:int(), float64(), string()
- 集合操作:len(), cap(), append()
- 并发:go, close()
- 错误处理:panic(), recover()
Python
- 输入输出:print(), input()
- 类型转换:int(), float(), str(), bool()
- 数学运算:abs(), round(), min(), max(), sum()
- 迭代与序列操作:len(), range(), sorted(), enumerate()
- 对象操作:type(), isinstance(), dir()
- 高阶函数: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]bool
或 map[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 元素个数