我的Go+语言初体验——Python开发者轻松上手

简介: DT时代的到来,驱动全球形成海量数据的爆发式增长态势,尤其是 2020 年以来对于实体经济的重大变革,全球对于数据加工、分析、挖掘等需求日益迫切。在此背景下,数据科学家、数据分析师的人才培育面临着入门门槛较高的困境

一、综述



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!


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=32println(3 +4 * 5+8 / 2-12)   # 四则运算arr := [1, 3, 5, 7, 11, 13, 17, 19]    # 列表Listprintln(arr)
println([x*x for x <- arr, x > 3])     # 列表解析式m := {"Hi": 1, "Go+": 2}        # Map literalprintln(m)
println({v: k for k, v <- m})  
println([k for k, _ <- m])      # 取keyprintln([v for v <- m])         # 取value


结果如下:



Go语言语法注释使用 “//”,在Playground玩耍,发现用Python的 “#” 注释也没有报错!还发现,这个在线 Playground 已经给了一些代码可供测试学习,如下所示:



下面我们自己编写一些实例来玩玩~


Go标准语法,字符串替换:


packagemainimport (
fmt"fmt"strings"strings")
funcmain() {
x :=strings.NewReplacer("?", "!").Replace("Hello, World???")
fmt.Println(x)
}
# Hello, World!!!


交换两个变量:


//Go+风格varx=6vary=8println("x =", x, "y =", y)
x, y=y, xprintln("x =", x, "y =", y)


//Go标准语法packagemainfuncmain(){
varx=6vary=8println("x =", x, "y =", y)
x, y=y, xprintln("x =", x, "y =", y)
}


跟 Python 一样简洁,可以通过 x, y = y, x 直接交换两个变量的值,而无需借助临时变量。如下所示:



打印九九乘法表:


//Go+风格fori :=range1:10 {
forj :=range1:i+1 {
print(j, "*", i, "=", (j*i), "\t")
        }
println("")
}


//Go标准语法packagemainfuncmain(){
fori :=range1:10 {
forj :=range1:i+1 {
print(j, "*", i, "=", (j*i), "\t")
        }
println("")
    }
}


结果如下:



编写一个 Go+ 语言程序,判断你的 BMI 分类。




packagemainimport"fmt"//引入包fmt提供格式化、输出、输入函数funcmain() {
weight :=75//体重75kgheight :=1.81//身高mBMI :=float64(weight) / (height*height)
ifBMI<18.5 {
fmt.Println("体重过低")
    } elseifBMI>=18.5&&BMI<25 {
fmt.Println("正常范围")
    } else {
fmt.Println("超重")
    }
}


结果如下:



四、Go+制作爱心


制作爱心:


packagemainimport (
"flag""fmt""math""strings""time")
funcmain() {
varheadstringvartailstringvarMYWORDstringvarsepstringvarzoomfloat64flag.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 :=rangechars {
allChar :=make([]string, 0)
fory :=12*zoom; y>-12*zoom; y-- {
lst :=make([]string, 0)
lstCon :=""forx :=-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)
ifformula<=0 {
index :=int(x) %len(char)
ifindex>=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 :=rangeallChar {
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+ 开发者社区学习更多有关知识!

目录
相关文章
|
6天前
|
Go
Go 语言循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。
15 1
|
5天前
|
Go 开发者
探索Go语言的并发之美
在Go语言的世界里,"并发"不仅仅是一个特性,它是一种哲学。本文将带你领略Go语言中goroutine和channel的魔力,揭示如何通过Go的并发机制来构建高效、可靠的系统。我们将通过一个简单的示例,展示如何利用Go的并发特性来解决实际问题,让你的程序像Go一样,轻盈而强大。
|
6天前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
6天前
|
Go
go语言创建字典
go语言创建字典
|
7天前
|
安全 Go 数据处理
探索Go语言的并发之美:Goroutines与Channels
在Go语言的世界里,"并发"不仅仅是一个概念,它是一种生活的方式。本文将带你领略Go语言中Goroutines和Channels的魔力,它们是如何让并发编程变得既简单又高效。我们将通过一个简单的示例,展示如何使用这些工具来构建一个高性能的网络服务。
|
7天前
|
关系型数据库 Go 数据处理
高效数据迁移:使用Go语言优化ETL流程
在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
|
8天前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
8天前
|
Go
go语言注释,标识符 | 17
go语言注释,标识符 | 17
|
7天前
|
NoSQL Go API
go语言操作Redis
go语言操作Redis
|
7天前
|
Unix Go
go语言获取当前时间戳
go语言获取当前时间戳
下一篇
无影云桌面