Сравнительное исследование: Golang VS Python3

Python Go

И 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 предоставляет два метода обработки ошибок.

  1. возврат функцииerrorОшибка определения типа объекта
  2. 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

  1. использоватьthreadв модулеstart_new_thread()функция
  2. использовать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.

постскриптум

Знаний, которые следует задействовать в тексте, еще много, но они не разъяснены подробно, неполны и даже неизбежны некоторые ошибки.

Если вы считаете, что эта статья полезна для вас, я надеюсь получить ваши лайки и поддержку.Если в статье есть ошибки, я также надеюсь, что вы, не колеблясь, дайте мне знать, и общаться и учиться с вами через комментарии или паблик Счета.

晓代码