我的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+ 的游乐场!

三、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)                  # 左移52^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+项目

六、推荐学习

“贡献一行代码,让改变发生”。Go+团队期待与更多开发者、生态伙伴一起推动、探索 Go+ 生态的生长方向,探寻技术的未来!

感兴趣的读者朋友们可以加入 Go+ 开发者社区学习更多有关知识!

【“我的GO+初体验” | 征文活动进行中…】 👍👍👉 https://bbs.csdn.net/topics/603464006

以上是关于我的Go+语言初体验——Python开发者轻松上手的主要内容,如果未能解决你的问题,请参考以下文章

我的Go+语言初体验—— 一个Golang开发者的Go+初体验

我的Go+语言初体验——IDE 详细安装教程

我的Go+语言初体验——在Docker建立一个可以用Go+语言开发的容器环境(以Ubuntu容器为例)

我的Go+语言初体验——语法验证/性能测试篇(直男程序员的真实体验)

我的Go+语言初体验——初学者的快速入门

我的Go+语言初体验——环境搭建篇(直男程序员的真实体验)