И Golang, и Python в настоящее время являются одними из самых популярных языков разработки в своих областях.
Эффективный и дружественный синтаксис Golang завоевал расположение многих внутренних разработчиков, и это один из наиболее подходящих языков для сетевого программирования с высокой степенью параллелизма.
Излишне говорить, что Python, входящий в первую десятку постоянных резидентов рейтинга TIOBE, теперь стабилизировался в первой пятерке. Он стал обязательным для изучения языком в области машинного обучения, искусственного интеллекта и анализа данных.
Оба языка программирования имеют свои особенности с точки зрения синтаксиса, и обаПростота в освоении и использовании.
Цель этой статьи сравнить два языка не соревноваться за превосходство и неполноценность, а сравнивать и учиться.Она подходит для студентов, которые освоили Python и хотят выучить Go или освоили Go и хотят выучить Python.
Go и Python, один язык статический, а другой язык динамический, имеют принципиальные отличия во всех аспектах, поэтому многое из содержания в тексте сравнивать по глубине не будем, сравниваем только наиболее понятный программистам синтаксис. .
Для простоты чтения код, задействованный в тексте, представлен в максимально простом виде.
Кодировка символов
Python
Формат кодировки по умолчанию в Python2 — формат ASCII.Если файл программы содержит китайские символы (включая комментарии), их необходимо добавить в начало файла.# -*- coding: UTF-8 -*-
или#coding=utf-8
просто хорошо
Python3 поддерживает Unicode по умолчанию.
Golang
Встроенная поддержка Юникода
зарезервированные слова (ключевые слова)
Python
30 ключевых слов
and exec not
assert finally or
break for pass
class from print
continue global raise
def if return
del import try
elif in while
else is with
except lambda yield
Golang
25 ключевых слов
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
Примечания
Python
# 单行注释
'''
多行注释
多行注释
'''
"""
多行注释
多行注释
"""
Golang
//单行注释
/*
多行注释
多行注释
*/
присвоение переменной
Python
Python — это динамический язык, поэтому вам не нужно объявлять тип при определении переменных, вы можете использовать их напрямую. Python определяет тип на основе значения.
name = "Zeta" # 字符串变量
age = 38 # 整数
income = 1.23 # 浮点数
присвоение нескольких переменных
a,b = 1,2 # a=1; b=2
c = d = 3 # c=3; d=3
Golang
Go — статический язык со строгой типизацией, но язык Go также позволяет определять типы при присвоении переменных.
Итак, в Go есть несколько способов объявления переменных.
// 1. 完整的申明并赋值
var a int
a = 1
// 2. 声明变量类型同时赋值
var a int = 1
// 3. 不声明类型,赋值时确定
var a = 1
// 4. 不用 var 关键字申明变量并赋值后确定类型
a := 1
Обратите внимание, что ключевое слово new в Go не объявляет переменную, а возвращает указатель этого типа.
a := new(int) //这时候a是一个*int指针变量
Стандартные типы данных
Стандартные типы данных в Python:
- Булево (логическое)
- Число
- Строка (строка)
- Список
- Кортеж (кортеж)
- Набор
- Словарь (словарь)
Golang
- логическое значение (логическое значение)
- числовой (число)
- строка (строка)
- массив (массив)
- срез (срез: массив неопределенной длины)
- карта (словарь)
- структура
- указатель
- функция
- интерфейс
- канал
Суммировать
в ПитонеСписокСоответствует языку Goломтик ломтик
в ПитонеСловарь СловарьСоответствует языку Gomap
Стоит отметить несколько вещей:
- Go — это язык, поддерживающий функциональное программирование, поэтому в Go функция — это тип
- Язык Go не является объектно-ориентированным языком, он не определяет ключевое слово Class для класса, для реализации программирования в стиле ООП он реализуется через типы структур и интерфейсов.
- Кортежи и наборы в Python отсутствуют в Go
- Канал — это уникальный тип в Go, и от него зависит взаимодействие между несколькими потоками.
преобразование типа данных
Python
Преобразование типов Python очень простое, просто используйте имя типа в качестве имени функции.
int(n) # 将数字n转换为一个整数
float(n) # 将数字n转换到一个浮点数
str(o) # 将对象 obj 转换为字符串
tuple(s) # 将序列 s 转换为一个元组
list(s) # 将序列 s 转换为一个列表
set(s) # 将序列 s 转换为一个集合
Golang
Базовое преобразование типов в языке Go похоже на преобразование в Python, а имя типа используется в качестве имени функции.
i := 1024
f := float32(i)
i = float32(f)
Кроме того, числовые строки и числа могут быть преобразованы непосредственно в Python:
s = "123"
i = 456
print(int(s), str(i))
Но Го не может.
Работа со строками в Go сильно отличается.string()
можно использовать только для[]byte
Тип преобразуется в строку, а для преобразования других базовых типов необходимо использоватьstrconv
пакет, кроме того, другие типы преобразуются вstring
типа кромеstrconv
пакет, вы также можете использоватьfmt.Sprintf
функция:
package main
import (
"fmt"
"strconv"
)
func main() {
s := "123"
i, _ := strconv.Atoi(s)
println(i)
s2 := fmt.Sprintf("%d", 456)
println(s2)
}
Тип интерфейса в Go не может быть напрямую преобразован в другие типы, вам нужно использоватьутверждение
package main
func main() {
var itf interface{} = 1
i, ok := itf.(string)
println("值:", i, "; 断言结果", ok)
j, ok := itf.(int)
println("值:", j, "; 断言结果", ok)
}
Результат:
值: ; 断言结果 false
值: 1 ; 断言结果 true
Условные операторы
Python
Традиционное суждение Python выглядит следующим образом
if name == 'zeta': # 判断变量是否为 zeta
print('Welcome boss') # 并输出欢迎信息
else:
print('Hi, ' + name)
Python не поддерживает троичные выражения, но можно использовать аналогичную альтернативу.
title = "boss"
name = "zeta" if title == "boss" else "chow"
print(name)
логика и использованиеand
, логическое ИЛИ сor
Golang
Идтиif
Синтаксис похож на Java, но выражение не нужно использовать()
if a > b{
println("a > b")
} else {
println("a <= b")
}
В Go также нет троичных выражений, и альтернативы ему нет.
Кроме того, иди позволяетif
Переменные определяются в выражении;
Если разделить, общая ситуация состоит в том, чтобы заставить функцию возвращать ошибку, а затем определить, является ли ошибка пустой:
if err := foo(); err != nil {
println("发生一些错误")
}
В отличие от Python, логика и использование&&
, логическое ИЛИ с||
оператор цикла
Python
Python имеетwhile
иfor
Можно использовать обе петлиbreak
вырваться из петли иcontinue
Немедленно введите следующий цикл цикла, кроме того, также можно использовать оператор цикла Python.else
Выполните код после завершения всех циклов,break
Не выполняется после прыжкаelse
код
whileусловный цикл,
count = 0
while (count < 9):
print('The count is:', count)
count = count + 1
if count == 5:
break # 可以比较以下break和不break的区别
pass
else:
print('loop over')
forпройти цикл, который проходит через все дочерние элементы объекта последовательности
names = ['zeta', 'chow', 'world']
for n in names:
print('Hello, ' + n)
if n == 'world':
break
pass
else:
print('Good night!')
for
также можно использовать в циклеelse
, (закомментироватьbreak
Попробуйте. )
Golang
Язык Go имеет только один оператор циклаfor
, но по разным выражениям,for
иметь разные представления
for 前置表达式; 条件表达式; 后置表达式 {
//...
}
предварительное выражениеВыполняется перед каждым раундом цикла, может использоваться для объявления переменных или вызова функций для возврата;условное выражениеЕсли выражение удовлетворено, выполнить следующий цикл, в противном случае выйти из цикла;постфиксвыполнить после завершения цикла
Классическое использование:
for i := 0; i < 10; i++ {
println(i)
}
Мы можем игнорировать пре- и пост-выражения
sum := 1
for sum < 10 {
sum += sum
}
Настройка может игнорировать все выражения, то есть бесконечный цикл
for {
print(".")
}
Идтиfor
Также можно использовать петлиbreak
выйти из цикла иcontinue
Сразу переходите к следующему циклу.
for
Помимо зацикливания с выражениями, его также можно использовать для циклов обхода, вам нужно использоватьrange
ключевые слова
names := []string{"zeta", "chow", "world"}
for i, n := range names {
println(i,"Hello, " + n)
}
функция
Python
использоватьdef
Ключевое слово определяет функцию, а в Python, являющемся языком сценариев, вызов функции должен происходить после определения функции.
def foo(name):
print("hello, "+name)
pass
foo("zeta")
параметры по умолчаниюКогда Python определяет параметр функции, вы можете установить значение по умолчанию. Если параметр не передается при вызове, в функции будет использоваться значение по умолчанию. Параметр значения по умолчанию должен быть помещен после параметра без значения по умолчанию.
def foo(name="zeta"):
print("hello, "+name)
pass
foo()
аргументы ключевого словаПри передаче параметров в общую функцию они должны передаваться в том порядке, в котором параметры указаны, однако в Python разрешены параметры с ключевыми словами, поэтому при указании параметров параметры могут передаваться в другом порядке, чем заданные параметры. по функции.
def foo(age, name="zeta"):
print("hello, "+name+"; age="+str(age))
pass
foo(name="chow", age=18)
параметр переменной длины, Python поддерживает параметры переменной длины, используйте*
Определите имя параметра.При вызове несколько параметров будут переданы в функцию в виде кортежа
def foo(*names):
for n in names:
print("hello, "+n)
pass
foo("zeta", "chow", "world")
returnВернуть результат функции.
Golang
для гоfunc
Определяет функцию без аргументов значения по умолчанию, без аргументов ключевого слова, но со многими другими функциями.
func main() {
println(foo(18, "zeta"))
}
func foo(age int, name string) (r string) {
r = fmt.Sprintf("myname is %s , age %d", name, age)
return
}
Нет порядка, в котором функции определяются и вызываются.
Функции Go могут не только определять тип возвращаемого значения функции, но также объявлять переменную возвращаемого значения.return
У оператора не должно быть возвращаемого значения, и функция будет использовать переменную возвращаемого значения для возврата по умолчанию.
переменный параметр
использовать…类型
Определите переменные параметры, параметры, полученные в функции, на самом деле являются类型
изslice
объект
func main() {
println(foo(18, “zeta”, “chow”, “world”))
}
func foo(age int, names …string) (r string) {
for _, n := range names {
r += fmt.Sprintf(“myname is %s , age %d \n”, n, age)
}
return
}
отсрочить приговор
defer
Функция указывается после оператора, и функция будет отложена до тех пор, пока функция не вернется, а затем не будет выполнена.
Оператор defer очень полезен в языке Go. За подробностями обращайтесь к другой статье в этой колонке "Исследование Golang: как освоить и эффективно использовать отсрочку (отложенное выполнение)》
func foo() {
defer fmt.Println("defer run")
fmt.Println("Hello world")
return
}
результат операции:
Hello world
defer run
Также на языке Goфункции являются типами, который можно передать в качестве параметра другим функциям
func main() {
n := foo(func(i int, j int) int {
return i + j
})
println(n)
}
func foo(af func(int, int) int) int {
return af(1, 2)
}
В приведенном выше примере тип функции используется непосредственно в определении параметра, что выглядит немного запутанно.
Давайте рассмотрим наглядный и полный пример, все в комментариях.
package main
type math func(int, int) int //定义一个函数类型,两个int参数,一个int返回值
//定义一个函数add,这个函数两个int参数一个int返回值,与math类型相符
func add(i int, j int) int {
return i + j
}
//再定义一个multiply,这个函数同样符合math类型
func multiply(i, j int) int {
return i * j
}
//foo函数,需要一个math类型的参数,用math类型的函数计算第2和第3个参数数字,并返回计算结果
//稍后在main中我们将add函数和multiply分别作为参数传递给它
func foo(m math, n1, n2 int) int {
return m(1, 2)
}
func main() {
//传递add函数和两个数字,计算相加结果
n := foo(add, 1, 2)
println(n)
//传递multply和两个数字,计算相乘结果
n = foo(multiply, 1, 2)
println(n)
}
результат
3
2
модуль
Python
- Модуль представляет собой файл .py
- Модули выполняются при первом импорте
- Один знак подчеркивания определяет защищенные переменные и функции, а два знака подчеркивания определяют закрытые переменные и функции.
- Импорт модулей обычно вверху скрипта, но не обязателен
Golang
- Независимо от файла и имени файла, первая строка каждого файла определяет имя пакета с package, а одно и то же имя пакета является пакетом.
- Переменные в пакете инициализируются при первом обращении к ним.Если пакет содержит функцию инициализации, она также будет выполнена при первом обращении (после инициализации переменной).
- Позаботьтесь о том, чтобы функции и переменные с заглавными буквами были общими, а строчные — приватными.Golang не объектно-ориентирован, поэтому уровня защиты нет.
- Модуль импорта должен быть написан после пакета и перед другим кодом.
импортный пакет
Python
В Python используйтеimport
Импортируйте модуль.
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 导入模块
import support
support.print_func(“Runoob”)
также можно использоватьfrom import
указанный раздел модуля импорта
from modname import name1[, name2[, ... nameN]]
Установите псевдонимы для импортированных пакетов с помощьюas
ключевые слова
import datetime as dt
Golang
также использоватьimport
Импортируйте пакет, пакет импорта указывает путь к пакету, а имя пакета по умолчанию соответствует последней части пути.
import "net/url" //导入url包
Доступно несколько пакетов()
комбинированный импорт
import (
"fmt"
"net/url"
)
Задайте псевдонимы для импортируемых пакетов.При импорте пакетов добавляйте псевдонимы непосредственно перед регистрацией, разделяя их пробелами.
import (
f "fmt"
u "net/url"
)
ошибки и исключения
Python
Python использует классическийtry/except
поймать исключение
try:
<语句> #运行别的代码
except <异常名称>:
<语句> #
except <异常名称>,<数据>:
<语句> #如果引发了指定名称的异常,获得附加的数据
также обеспечиваетelseиfinally
Если не происходит исключенияelse
блок операторов,finally
Код блока выполняется независимо от того, поймано исключение или нет
Python имеет встроенные очень подробные имена типов исключений и может настраивать типы исключений.
Golang
В Голанге нет использования классикиtry/except
Поймать исключение.
Golang предоставляет два метода обработки ошибок.
- возврат функции
error
Ошибка определения типа объекта -
panic
аномальный
В общем, использовать только в Goerror
Ошибка оценки типа. Официальный представитель Go надеется, что разработчики смогут четко контролировать все исключения и возвращать или оценивать каждое возможное исключение.error
он существует.
error
встроенный тип интерфейса
type error interface {
Error() string
}
Обычно используютerror
Обработка исключений выглядит так:
package main
import "fmt"
func foo(i int, j int) (r int, err error) {
if j == 0 {
err = fmt.Errorf("参数2不能为 %d", j) //给err变量赋值一个error对象
return //返回r和err,因为定义了返回值变量名,所以不需要在这里写返回变量
}
return i / j, err //如果没有赋值error给err变量,err是nil
}
func main() {
//传递add函数和两个数字,计算相加结果
n, err := foo(100, 0)
if err != nil { //判断返回的err变量是否为nil,如果不是,说明函数调用出错,打印错误内容
println(err.Error())
} else {
println(n)
}
}
panic
Его можно вызвать вручную, но Golang официально рекомендует не использовать его как можно чаще.panic
, каждое исключение должно быть перехвачено с помощью объекта ошибки.
Язык Go в некоторых случаях запускает встроенныйpanic
, такие как 0 деление, выход за пределы массива и т. д., изменить приведенный выше пример, мы позволяем функции вызывать 0 делениеpanic
package main
func foo(i int, j int) (r int) {
return i / j
}
func main() {
//传递add函数和两个数字,计算相加结果
n := foo(100, 0)
println(n)
}
появится после запуска
panic: runtime error: integer divide by zero
goroutine 1 [running]:
main.foo(...)
/lang.go:4
main.main()
/lang.go:9 +0x12
exit status 2
руководствоpanic
Это можно сделать следующим образом:
func foo(i int, j int) (r int) {
if j == 0 {
panic("panic说明: j为0")
}
return i / j
}
После запуска вы можете увидеть, что первое предложение сообщения об ошибке:
panic: panic说明: j为0
объектно-ориентированный
Python
Python полностью поддерживает объектно-ориентированный язык.
Golang
Хотя Go допускает объектно-ориентированный стиль программирования, по своей сути он не является объектно-ориентированным.
Оригинальный текст официального FAQ
Is Go an object-oriented language?
И да, и нет. Хотя в Go есть типы и методы и допускается объектно-ориентированный стиль программирования, иерархии типов нет. Существуют также способы встраивания типов в другие типы, чтобы обеспечить что-то аналогичное, но не идентичное, для создания подклассов. Более того, методы в Go более общие, чем в C++ или Java: их можно определить для любого типа данных, даже встроенных -in, такие как простые, «неупакованные» целые числа Они не ограничиваются структурами (классами).
Многопоточность
Python
- использовать
thread
в модулеstart_new_thread()
функция - использовать
threading
поток создания модуля
Golang
использовать ключgo
Создать сопрограммуgoroutine
существуетgo
Указание функции после ключевого слова запустит сопрограмму для запуска функции.
package main
import (
"fmt"
"time"
)
func foo() {
for i := 0; i < 5; i++ {
fmt.Println("loop in foo:", i)
time.Sleep(1 * time.Second)
}
}
func main() {
go foo()
for i := 0; i < 5; i++ {
fmt.Println("loop in main:", i)
time.Sleep(1 * time.Second)
}
time.Sleep(6 * time.Second)
}
В языке Go связь между сопрограммами осуществляется черезchannel
Реализовано:
package main
import (
"fmt"
"time"
)
//接受一个chan类型的参数c
func foo(c chan int) {
time.Sleep(1 * time.Second) //等待1秒
c <- 1024 //向c中写入数字
}
func main() {
c := make(chan int) //创建chan变量c
go foo(c) //在子写成中运行函数foo,并传递变量c
fmt.Println("wait chan 'c' for 1 second")
fmt.Println(<-c) //取出chan 'c'的值(取值时,如果c中无值,主县城会阻塞等待)
}
Суммировать
Python и Go — одни из самых простых языков программирования для изучения и использования в динамических и статических языках соответственно.
Между ними нет отношений замещения, но каждый играет свою роль в своем поле.
Синтаксис Python прост и интуитивно понятен, и он очень подходит для практиков в других областях, помимо программистов.
Go имеет преимущества простого синтаксиса и эффективной работы. Он отлично подходит для многопоточности. Он очень подходит для студентов, которые освоили определенные основы программирования и основной язык. Однако Go не поддерживает объектно-ориентированный. Пользователям объектного языка необходимо иметь в виду и переключать идеи программирования при изучении языка Go.
постскриптум
Знаний, которые следует задействовать в тексте, еще много, но они не разъяснены подробно, неполны и даже неизбежны некоторые ошибки.
Если вы считаете, что эта статья полезна для вас, я надеюсь получить ваши лайки и поддержку.Если в статье есть ошибки, я также надеюсь, что вы, не колеблясь, дайте мне знать, и общаться и учиться с вами через комментарии или паблик Счета.