范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Golang跟Python3的区别对比有哪些?

  本文对比这两门语言目的不是争谁优谁略,只是为了对比学习,适合掌握Python想学Go或者掌握Go想学Python的同学们参考。
  Golang和Python都是目前在各自领域最流行的开发语言之一。
  Golang其高效而又友好的语法,赢得了很多后端开发人员的青睐,最适用于高并发网络编程的语言之一。
  Python不用说,TIOBE排行榜的前十常驻居民,现在已经稳定在前五了。在机器学习、AI、数据分析领域成为必学语言。
  两门编程语言在语法上都有各自的特点,而且都易学易用。
  Go和Python,一个是静态语言一个是动态语言,从各个方面来看,都有根本性的差异,所以,文中很多内容不进行深入的比较了,我们只从程序员最直观的语法面做对比。
  为了便于阅读,文中涉及代码都采用尽量简单的语句呈现字符编码Python
  Python2中默认的编码格式是 ASCII 格式,程序文件中如果包含中文字符(包括注释部分)需要在文件开头加上 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了
  Python3默认支持UnicodeGolang
  原生支持Unicode保留字(关键字)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 复制代码 复制代码
  注意,Go中的new关键字并不是声明变量,而是返回该类型的指针a := new(int) //这时候a是一个*int指针变量 复制代码 复制代码标准数据类型Python 的标准数据类型有:Boolean(布尔值)Number(数字)String(字符串)List(列表)Tuple(元组)Set(集合)Dictionary(字典)Golangboolean(布尔值)numeric(数字)string(字符串)数组(数组)slice(切片:不定长数组)map(字典)struct(结构体)pointer(指针)function(函数)interface(接口)channel(通道)总结
  Python中的List列表对应Go语言中的Slice切片
  Python中的Dictionary字典对应Go语言中的map
  有一些值得注意的地方:Go是支持函数编程的语言,所以在Go语言中函数是一个类型Go语言不是面向对象的语言,没有定义类的关键字Class,要实现OOP风格编程,是通过struct、interface类型实现的Python中的元组和集合在Go中都没有channel是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是不可以的。
  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中的interface类型是不能直接转换成其他类型的,需要使用到断言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 ,逻辑或用 orGolang
  Go的if的语法类似Java,但是表达式不需要使用()if a > b{     println("a > b") } else {     println("a <= b") } 复制代码 复制代码
  Go同样没有三元表达式,并且也没有什么替代方法。
  另外,Go允许在if的表达式里定义变量,定义并赋值的表达式与判断的表达式用;隔开,常见的情况是获取函数返回error,然后判断error是否为空: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(".") } 复制代码 复制代码
  Go的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
  Go用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, age) 	}  	return } 复制代码 复制代码
  defer句
  defer语句后面指定一个函数,该函数会延迟到本函数return后再执行。
  defer语句在Go语言中非常有用,详细可以查阅本专栏的另一篇文章《Golang研学:如何掌握并用好defer(延迟执行) 》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定义包名,相同包名为一个包包中的变量第一次引用时初始化,如果包中包含init函数,也会在第一次引用时执行(变量初始化后)保重首写字母大写的函数和变量为共有,小写字母为私有,Golang不是面向对象的,所以不存在保护级。导入模块必须写在package之后,其他代码之前。导入包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
  Golang里没有用经典的 try/except捕获异常。
  Golang提供两种错误处理方式函数返回error类型对象判断错误panic异常
  一般情况下在Go里只使用error类型判断错误,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,每一个异常都应该用error对象捕获。
  Go语言在一些情况下会触发内建的panic,例如 0 除、数组越界等,修改一下上面的例子,我们让函数引起0除panicpackage 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 pide 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?
  Yes and no. Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy. The concept of "interface" in Go provides a different approach that we believe is easy to use and in some ways more general. There are also ways to embed types in other types to provide something analogous—but not identical—to subclassing. Moreover, methods in Go are more general than in C++ or Java: they can be defined for any sort of data, even built-in types such as plain, "unboxed" integers. They are not restricted to structs (classes).多线程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语言的时候,需要谨记并且转换编程思路。
  作者:小新DS
  链接:https://juejin.cn/post/7042211939795075103
  来源:稀土掘金
  著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

商用自动洗碗机的特点自动洗碗机是否好用,都必须从不同的角度判断,如方便程度,价格是否符合大多数消费者要求,安装是否方便等等。今天,从洗碗机价格和性能两方面简单介绍。自动洗碗机方便吗?自动洗碗机通常具有餐饮行业自动洗碗机餐具通常是餐饮管理的重点和薄弱环节,许多餐馆都有餐具损坏率高和洗碗不干净现象。餐具损坏和清洁餐具不干净不仅降低餐具的质量,而且增加了成本,也影响了公众形象和健康安全保护。客户不愿意自动洗碗机操作的注意事项中大型餐饮机构用洗碗机洗碗,原本需要34个人做的工作量,现在两个人就可以轻松完成,把碗放在洗碗机里,然后把它拿出来,节省时间和繁琐的过程,让洗碗不再枯燥繁琐。正确使用和定期维护洗碗商用洗碗机的分类及工作原理商用洗碗机有平铺式和长龙式,商用洗碗机受到许多酒店,连锁餐厅,学校和其他餐饮公司的青睐。虽然商用洗碗机可用于不同的规格,尺寸,不同材料的餐具清洗,但由于清洁差异,效果不同。陶瓷餐具餐饮自动洗碗机的优缺点现在在餐饮行业,自动洗碗机已经是非常普遍的,无论是酒店还是自助餐厅食堂厅,都可能需要商用洗碗机。市场上自动洗碗机的价格一般为数万元元。根据产品质量,价格从数万到数十万不等。如何购买自动洗碗机的功能特点使用全自动洗碗机清洗餐具并操作正确,清洁程度可以达到98。人工洗涤干净的餐具,即使你看到表面明亮清洁,实际上也有你看不到的细菌和病毒。因此,只有自动洗碗机有效的消毒,让食客吃饭更放揭盖式洗碗机的特性1。清洗全封闭洗涤,无需抹布,切断细菌传播路径。2,消毒使用加热和专业洗涤消毒剂,可杀死大肠杆菌,沙氏门菌等病毒。3,干燥洗涤后直接干燥,避免留下的水痕,使餐具更加光滑。4,存储容是否有必要使用自动洗碗机?为什么餐厅,食堂,酒店需要洗碗机?简单地说,酒店,餐厅采用自动洗碗机,提高洗碗工作效率,减少洗碗工的劳动强度,同时保障了食客的健康。洗碗机和人工洗碗的优势是什么?使用洗碗机洗碗筷,商用自动洗碗机与人工洗碗对比与人工洗涤相比,洗碗机的洗碗速度具有相当大的优势,并且自动洗碗机的清洁速度甚至可以超过5个洗碗工。食堂洗碗机已成为许多酒店和餐馆所需的厨房设备之一。在水和电力方面,自动洗碗机的平均商用自动洗碗机的特点一般而言,自动洗碗机包含自动除渣,自动清洁,自动喷淋冲洗,自动烘干等功能,清洁后的餐具可以直接使用。随着中国消费结构的升级,洗碗机已成为家电行业增长较快的类别之一。自动洗碗机进行科洗碗机和人工洗碗的优势对比为什么餐厅,食堂,酒店等地方需要用到洗碗机?简单地说,酒店餐厅采用自动洗碗机,提高洗碗的工作效率,降低洗碗工的劳动强度,确保食客的健康。洗碗机和人工洗碗的优势是什么?使用洗碗机清洗
把QQ动态表情移植到微信上?太魔性了不知道现在还有多少小伙伴会使用QQ呢?今天玩机哥在使用QQ时突发奇想,若是将QQ的动态表情移植到微信会不会更有趣呢?(获取素材方法往下翻)QQ表情玩机哥将数十款QQ表情进行了提取,从身价15万到身价15亿,胡玮炜只用了3年的时间,她是如何做到的2018年9月,曾今风光无限的ofo小黄车因为资金周转出现问题,导致亿万用户的押金无法退回。作为创始人的戴威,在短短几个月内,从亿万富翁变成老赖,还被法院限制消费,堪称年度最惨的富6个强大的的javascript工具库时间处理游戏引擎CSS动画等highlight。js官网httpshighlightjs。org让网页上的代码高亮美化的免费开源工具库,一行代码就能让我的网站支持代码高亮的工具库,也支持在Vue中使用,强烈推燃油车走到尽头了?我国宣布禁用时间,倒计时开始了燃油车从第1辆诞生开始,已经有了100多年的发展历史。许多人也表示燃油车的研发技术已经走到了终点很难再有突破性的进展,从各大车企开始纷纷向新能源汽车倾斜资源也可以看得出这点。我国有申通创始人25岁英年早逝,妻子改嫁司机,套现146亿后成功离场近些年来,我国的快递行业快速发展,到今年底,快递业务量已超千亿件,快递收入突破万亿元,稳居全球第一。每天有7亿多人次享受着快递服务,快递行业已经与我们的日常工作生活深度融合,四通一注意!电话卡开始二次实人认证运营商给我发了二次实人认证的信息,是诈骗短信吗?近日,有市民收到手机号需要二次实人认证的信息,这是咋回事儿?12月20日,大河报豫视频记者从河南省反电信网络诈骗中心了解到,该信息是12月末想换5G千元机,预算1500左右的话,推荐入手这四款时间过得很快,距离2021年结束还有不到半个月的时间了,虽然说逐渐来到年底了,但手机厂商们并没有停止步伐,本月发布的新机还是十分多,甚至比前几个月还多。由于明年的新款迭代旗舰已经陆诸神黄昏后,农业也许会是下一个风口互联网行业的诸神黄昏?裁员降薪破产转型,经历了一轮长达二十多年的红利期,中国的互联网行业大约是走到尽头了。互联网行业大概率不会面临教育房地产这样的打击,但是可以预见的是,这个行业将割韭菜的四款智商检测机,看看是不是你在用的?有些手机配置低价格高,但至少不拉胯,也可以接受,但是一些手机真的是实实在在的坑用户的手机,给人的感觉就是在割韭菜,所以买的时候尽量避开这些手机,小编今天给大家盘点几部智商检测机,看全球首个零碳码头诞生12月15日,随着两台由金风科技自主研发的GW1554。5MW风力发电机组在天津港第二集装箱码头成功并网发电,全球首个零碳码头诞生,标志着金风科技零碳解决方案在港口场景应用从图纸变三星为了特斯拉拼了将量产5款芯片优先供应特斯拉今年早些时候,业界传出特斯拉正在选择芯片供应商,并且倾向于台积电,但经过一段时间的接触,韩国三星最终甩开台积电拿下特斯拉的超级订单。最初特斯拉对外宣布,将与韩国三星联手,共同研发一