我的Go+语言初体验——Python开发者轻松上手
Posted 叶庭云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的Go+语言初体验——Python开发者轻松上手相关的知识,希望对你有一定的参考价值。
一、综述
1. 背景
DT时代的到来,驱动全球形成海量数据的爆发式增长态势,尤其是 2020 年以来对于实体经济的重大变革,全球对于数据加工、分析、挖掘等需求日益迫切。在此背景下,数据科学家、数据分析师的人才培育面临着入门门槛较高的困境,主要体现为下述三大痛点:
-
一是编程教学难度加大。目前,在制定一套学习编程语言的课程体系时,普遍存在诸多棘手问题,譬如:教学与生产环节语言割裂,现有教学语言无法实现复杂功能与工程开发、工程开发教学门槛较高等;
-
二是工程开发要求高。在工程开发的实践中,存在着动态类型过于灵活,但运行速度较慢等难题,因此更简约、更高效的语言成为工程刚需。同时,企业对于从事工程开发的人才需求也在快速增长,但人才培养效率较低;
-
三是数据科学的发展需要。疫情加速了全球产业数字化的发展进程,驱动着数据科学的持续发展。因此,企业迫切需要一批优质的数据科学家,使其具备数据分析相关能力,并能不断迭代升级。Go+语言的出现,可以让开发者不需要学习新的开发语言,实现从开发者到数据科学家的快速转变,让任何商业、组织、个人的决策,都可以受益于数据科学的进步。
数据和数据科学,一定会成为下一代生产力的支撑!而数据科学的未来一定是通用语言和数学软件的融合,从而完成真正意义上的数据科学的基础设施化。
那么,问题来了:如今的 Python 已经很好了,在数据科学和机器学习领域已经被非常广泛地使用,为什么有了 Python 还不够,还需要 Go+?个人认为,Python是很难成为基础设施的,它是一个脚本语言,可能仅仅是特定历史阶段的需要。数据科学本身是一种算力革命,算力本质上是一种计算密集型业务,上层软件领域就更加如此,需要有一个新的基础设施承载者出现。Python的背后是C,只靠 Python 还是不行。今天是 C 和 Python 支撑了整个深度学习,但数据科学一定还要进一步下沉,下沉的结果是什么?这是我们今天需要 Go+ 的原因!
2. Go+的设计理念
- 用 Go+ 来统一程序员和数据科学家,让他们之间有共同话语,让双方能自然对话。
- Go+是一个静态语言,语法是完全兼容 Go 的;形式上要比 Go 更像脚本,有更低的学习门槛(会比 Python 更容易)。
- 数据科学的语言:必然要有更简洁的、数学运算上的语言文法支持;双引擎:同时支持静态编译为可执行文件,也支持编译成字节码来解释执行。
静态语言拥有更强的生命力,更能跨越历史的周期。大家也都很容易理解,语言是需要跨越周期的,语言的生命周期通常都非常长。我们不能很局限地说,当前在流行些什么东西,我们就如何决定语言的设计,实际上我们要找到那些能够跨越周期的元素。Go的语法设计最为精简,学习门槛也是最低的,哪怕你以前没有学过静态语言,也很容易学会Go。但从数据科学语言来讲,Go的门槛还不够低,Go+虽然完全兼容Go,但它比 Go 的门槛还要有更低。所以它形式上要比 Go 更像脚本,因为脚本往往更容易理解。目前,Go+1.0已经能够为工程使用,而且语言的使用门槛做了进一步的降低,更接近自然语言,1.0的门槛甚至比 Python 更低,使得 Go+ 更适合 STEM 教育的场景。
3. Go+主要特性
Go+的主要特性:
- Go+针对数据科学设计了简洁而易用的语法,比如 Go+ 对 List 和 Map 简洁实现,以及利用 List 和 Map 进行计算时的简洁语法。
- Go+保持对 Go 兼容:Go+目前支持了大部分 Go 语言的特性(比如流程控制、goroutine、channel、defer等);Go+可以 import 所有 Go 的包,而所有 Go+ 的包都能被转换成 Go 的包。
- Go+独有的双擎:bytecode backend 和生成 Go 源码运行。
- Go+实现了自己的 Playground、REPL、VSCode 插件等。
以 Python 之形结合 Go 之心,Go+作为一门能够正式应用于工程与数据的编程语言,从设计理念到语言特性均紧紧围绕"三位一体",融合工程开发的Go、数据科学的 Python 和教学领域的Scratch,让程序员与数据科学家沟通无碍,使初学者更易入门!
4. Why Go+ ?
- 对于数据科学家而言:意味着你们将和工程师使用同一种语言进行合作和交流。
- 对于工程领域而言:意味着大家将会使用一门简单、易学、好用的编程语言。
- 对于 STEM 教育而言: 掌握一门可能会在将来工作中用到的工程语言将大有裨益。
GO+语言作为基于 Go 研发的新语言,能够满足我国本土数据处理的需求,适应性更强。极大降低门槛,让人人都能写代码,相对 Go 在语言特性最小化方面做得最好,Go+语言继承 Go 的开发理念,新增 12 个语法,简化了使用门槛。具有更低学习门槛的编程语言将更有可能成为跨时代跨文明 “书同文” 背景下的优胜者,具备以上特性的Go+,或将迎来重大机遇!
我用 Python 爬取了网上报道【Go+ Together!Go+ 1.0 发布会暨 Go+ 开发者基金会启动仪式】的文章的内容,绘制词云图展示如下:
二、Go+的安装
在这之前需要安装上Golang:Golang 安装包下载
安装教程参考:https://www.liwenzhou.com/posts/Go/install_go_dev/
安装和配置好环境变量后,可以查看 go 的版本,如下所示:
然后安装上Git:Git安装包
当前,官方推荐下载源代码来安装Go+。
git clone https://github.com/goplus/gop.git
cd gop # 切换到gop文件夹目录
./all.bash
更详细的安装可以参考:https://zhuanlan.zhihu.com/p/396398360
IDE Plugins:https://github.com/gopcode/vscode-goplus
使用 IDE 编写Go+,目前支持的功能稍微多些的 Go+ IDE是微软的 VSCode 及插件vscode-goplus。
Github地址:https://github.com/gopcode/vscode-goplus
目前支持功能:语法高亮、代码格式化、自动补全、函数悬浮提示等。
用 Python 做数据处理和数据分析的时候,习惯用 jupyter notebook 环境来编写代码。官方也提供了 Go+ Jupyter 内核:
搭建开发环境还是比较麻烦的,但官方很贴心地给我们提供了可以在线玩 Go+ 的游乐场!
- 基于 Docker 的 Go+ Playground:https://play.goplus.org/
- 基于 GopherJS 的 Go+ Playground(目前仅在 v0.7.x 中可用):https://jsplay.goplus.org/
三、Go+编程初体验
1. Hello World!
Hello World!进入Go+语言的世界:
println("Hello World!I use Go+ ") // 函数式调用打印
fields := [
"engineering",
"STEM education",
"and data science",
]
println "The Go+ language for", fields.join(", ") // 拼接字符串 直接打印
点击 Run 运行,结果如下:
以上的两种打印输出很像 Python 风格,下面这种是 Go 语言语法风格:
package main
func main()
println("Hello World!")
2. 基本使用
之前熟悉 Python 的话,我们可以快速上手Go+,马上测试一波~~
println(1r << 5) # 左移5位 2^5=32
println(3 + 4 * 5 + 8 / 2 - 12) # 四则运算
arr := [1, 3, 5, 7, 11, 13, 17, 19] # 列表List
println(arr)
println([x*x for x <- arr, x > 3]) # 列表解析式
m := "Hi": 1, "Go+": 2 # Map literal
println(m)
println(v: k for k, v <- m)
println([k for k, _ <- m]) # 取key
println([v for v <- m]) # 取value
结果如下:
Go语言语法注释使用 “//”,在Playground玩耍,发现用Python的 “#” 注释也没有报错!还发现,这个在线 Playground 已经给了一些代码可供测试学习,如下所示:
下面我们自己编写一些实例来玩玩~
Go标准语法,字符串替换:
package main
import (
fmt "fmt"
strings "strings"
)
func main()
x := strings.NewReplacer("?", "!").Replace("Hello, World???")
fmt.Println(x)
# Hello, World!!!
交换两个变量:
// Go+风格
var x = 6
var y = 8
println("x =", x, "y =", y)
x, y = y, x
println("x =", x, "y =", y)
// Go标准语法
package main
func main()
var x = 6
var y = 8
println("x =", x, "y =", y)
x, y = y, x
println("x =", x, "y =", y)
跟 Python 一样简洁,可以通过 x, y = y, x
直接交换两个变量的值,而无需借助临时变量。如下所示:
打印九九乘法表:
// Go+风格
for i := range 1:10
for j := range 1:i+1
print(j, "*", i, "=", (j*i), "\\t")
println("")
// Go标准语法
package main
func main()
for i := range 1:10
for j := range 1:i+1
print(j, "*", i, "=", (j*i), "\\t")
println("")
结果如下:
编写一个 Go+ 语言程序,判断你的 BMI 分类。
package main
import "fmt" // 引入包fmt 提供格式化、输出、输入函数
func main()
weight := 75 // 体重 75kg
height := 1.81 // 身高 m
BMI := float64(weight) / (height * height)
if BMI < 18.5
fmt.Println("体重过低")
else if BMI >= 18.5 && BMI < 25
fmt.Println("正常范围")
else
fmt.Println("超重")
结果如下:
四、Go+制作爱心
制作爱心:
package main
import (
"flag"
"fmt"
"math"
"strings"
"time"
)
func main()
var head string
var tail string
var MYWORD string
var sep string
var zoom float64
flag.StringVar(&head, "head", "There are some words I want to tell you:", "A sentence printed on the head")
flag.StringVar(&tail, "tail", "\\t\\t\\t\\t--- Your lover", "A sentence printed on the tail")
flag.StringVar(&MYWORD, "words", "Dear, I love you forever!", "The words you want to talk")
flag.StringVar(&sep, "sep", " ", "The separator")
flag.Float64Var(&zoom, "zoom", 1.0, "Zoom setting")
flag.Parse()
chars := strings.Split(MYWORD, sep)
time.Sleep(time.Duration(1) * time.Second)
fmt.Println(head)
fmt.Println()
time.Sleep(time.Duration(1) * time.Second)
for _, char := range chars
allChar := make([]string, 0)
for y := 12 * zoom; y > -12*zoom; y--
lst := make([]string, 0)
lstCon := ""
for x := -30 * zoom; x < 30*zoom; x++
x2 := float64(x)
y2 := float64(y)
formula := math.Pow(math.Pow(x2*0.04/zoom, 2)+math.Pow(y2*0.1/zoom, 2)-1, 3) - math.Pow(x2*0.04/zoom, 2)*math.Pow(y2*0.1/zoom, 3)
if formula <= 0
index := int(x) % len(char)
if index >= 0
lstCon += string(char[index])
else
lstCon += string(char[int(float64(len(char))-math.Abs(float64(index)))])
else
lstCon += " "
lst = append(lst, lstCon)
allChar = append(allChar, lst...)
for _, text := range allChar
fmt.Printf("%s\\n", text)
time.Sleep(time.Duration(1) * time.Second)
fmt.Println("\\t\\t\\t\\t", tail)
效果如下所示:
以 Python 之形结合 Go 之心,Go+语法风格比标准 Go 语言语法更简洁。
五、Go+项目
-
spx - A Go+ 2D Game Engine for STEM education:https://github.com/goplus/spx
-
Tutorials for GoPlus (The Go+ Language):https://github.com/goplus/tutorial
六、推荐学习
“贡献一行代码,让改变发生”。Go+团队期待与更多开发者、生态伙伴一起推动、探索 Go+ 生态的生长方向,探寻技术的未来!
感兴趣的读者朋友们可以加入 Go+ 开发者社区学习更多有关知识!
【“我的GO+初体验” | 征文活动进行中…】 👍👍👉 https://bbs.csdn.net/topics/603464006
以上是关于我的Go+语言初体验——Python开发者轻松上手的主要内容,如果未能解决你的问题,请参考以下文章
我的Go+语言初体验—— 一个Golang开发者的Go+初体验
我的Go+语言初体验——在Docker建立一个可以用Go+语言开发的容器环境(以Ubuntu容器为例)