我的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+ 开发者社区学习更多有关知识!

目录
相关文章
|
7天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
30 0
|
1天前
|
Java Go
一文带你速通go语言指针
Go语言指针入门指南:简述指针用于提升效率,通过地址操作变量。文章作者sharkChili是Java/CSDN专家,维护Java Guide项目。文中介绍指针声明、取值,展示如何通过指针修改变量值及在函数中的应用。通过实例解析如何使用指针优化函数,以实现对原变量的直接修改。作者还邀请读者加入交流群深入探讨,并鼓励关注其公众号“写代码的SharkChili”。
8 0
|
1天前
|
存储 缓存 Java
来聊聊go语言的hashMap
本文介绍了Go语言中的`map`与Java的不同设计思想。作者`sharkChili`是一名Java和Go开发者,同时也是CSDN博客专家及JavaGuide项目的维护者。文章探讨了Go语言`map`的数据结构,包括`count`、`buckets指针`和`bmap`,解释了键值对的存储方式,如何利用内存对齐优化空间使用,并展示了`map`的初始化、插入键值对以及查找数据的源码过程。此外,作者还分享了如何通过汇编查看`map`操作,并鼓励读者深入研究Go的哈希冲突解决和源码。最后,作者提供了一个交流群,供读者讨论相关话题。
9 0
|
2天前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
15 1
Go语言学习11-数据初始化
|
2天前
|
自然语言处理 安全 Java
速通Go语言编译过程
Go语言编译过程详解:从词法分析(生成token)到句法分析(构建语法树),再到语义分析(类型检查、推断、匹配及函数内联)、生成中间码(SSA)和汇编码。最后,通过链接生成可执行文件。作者sharkchili,CSDN Java博客专家,分享技术细节,邀请读者加入交流群。
20 2
|
3天前
|
Java Linux Go
一文带你速通Go语言基础语法
本文是关于Go语言的入门介绍,作者因其简洁高效的特性对Go语言情有独钟。文章首先概述了Go语言的优势,包括快速上手、并发编程简单、设计简洁且功能强大,以及丰富的标准库。接着,文章通过示例展示了如何编写和运行Go代码,包括声明包、导入包和输出语句。此外,还介绍了Go的语法基础,如变量类型(数字、字符串、布尔和复数)、变量赋值、类型转换和默认值。文章还涉及条件分支(if和switch)和循环结构(for)。最后,简要提到了Go函数的定义和多返回值特性,以及一些常见的Go命令。作者计划在后续文章中进一步探讨Go语言的其他方面。
9 0
|
4天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
12 1
|
4天前
|
Go
|
5天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
133 1
|
5天前
|
算法 关系型数据库 MySQL
Go语言中的分布式ID生成器设计与实现
【5月更文挑战第6天】本文探讨了Go语言在分布式系统中生成全局唯一ID的策略,包括Twitter的Snowflake算法、UUID和MySQL自增ID。Snowflake算法通过时间戳、节点ID和序列号生成ID,Go实现中需处理时间回拨问题。UUID保证全局唯一,但长度较长。MySQL自增ID依赖数据库,可能造成性能瓶颈。选择策略时需考虑业务需求和并发、时间同步等挑战,以确保系统稳定可靠。
112 0