关于Go +的主要印象是什么?

静态类型语言。
与Go语言完全兼容。
类似脚本的样式,并且比Go更具可读性的数据科学代码。
例如,以下是合法的Go +源代码:

一个 := [ 1,2,3.4 ]
的println(一)
我们如何用Go语言做到这一点?

包主

FUNC 主(){
一个 := [] float64 { 1,2,3.4 }
的println(一)
}
当然,我们不仅要做少打字的事情。

例如,我们支持列表理解,这使数据处理更加容易。

一个 := [ 1,3,5,7,11 ]
b := [ X * X 为 X < - 一个,X > 3 ]
的println(b)//输出:[25 49 121]

属于MapData := { “HI” :1,“你好”:2,“去+” :3 }
reversedMap := { v:ķ 为 ķ,v < - 属于MapData }
的println(reversedMap)//输出:地图[1:您好2:Hello 3:Go +]
我们将使Go +变得简单。这就是为什么我们称其为Go +,而不是Go ++。

更少就是成倍增长。

它用于Go,也用于Go +。

与Go的兼容性
所有Go功能都将受支持(包括部分支持cgo,请参见下文)。

请参阅支持的Go语言功能。
所有Go软件包(甚至这些软件包都使用cgo)都可以通过Go +导入。

导入(
“ fmt”
“字符串”

x := 字符串。NewReplacer(“?”,“!”)。替换(“ hello,world ???”)
fmt。Println(“ x:”,x)
对它的工作方式感兴趣?请参阅在Go +程序中导入Go软件包。

此外,所有Go +软件包都可以转换为Go软件包,并导入Go程序中。

首先,让我们创建一个名为的目录tutorial/14-Using-goplus-in-Go。

然后编写一个名为Go +的软件包foo:

包foo

FUNC ReverseMap(米 地图[字符串] INT)地图[ INT ]串{
返回{ν:ķ 为 ķ,v < - 米}
}
然后在Go包中使用它:

包主

导入(
“ fmt”

“ github.com/goplus/gop/tutorial/14-Using-goplus-in-Go/foo”

func main(){
rmap := foo。ReverseMap(map [ string ] int { “ Hi”:1,“ Hello”:2 })
fmt。Println(rmap)
}
如何编译这个例子?

gop go tutorial / #将tutorial /中的所有Go +软件包转换为Go软件包
go install。/ …
或者:

gop install。/ … #转换Go +软件包,然后安装。/ …
转至tutorial / 14-Using-goplus-in-Go获取源代码。

游乐场/ REPL
基于GopherJS / WASM的Go + REPL:

https://repl.goplus.org/
基于Docker的Go + Playground:

https://play.goplus.org/
基于GopherJS的Go + Playground:

https://goplusjs.github.io/play/
Go + Jupyter内核:

https://github.com/wangfenjin/gopyter
讲解
参见https://github.com/goplus/gop/tree/master/tutorial

如何建造
git clone [email protected]:goplus / gop.git
cd gop
去安装-v。/ …
Go +功能
字节码与Go代码
Go +支持字节码后端和Go代码生成。

当我们使用gop go或gop install命令时,它会生成Go代码以将Go +包转换为Go包。

当我们使用gop run命令时,它不会调用go run命令。它生成要执行的字节码。

在字节码模式下,Go +不支持cgo。但是,在Go代码生成模式下,Go +完全支持cgo。

指令
gop run #运行Go +程序
gop repl #在REPL /控制台模式下运行Go +
gop go [-test] #将Go +软件包转换为Go软件包。如果指定了-test,它将测试相关的软件包。
gop fmt #格式化Go +软件包
gop导出 #导出Go +程序的Go软件包
有关详细信息,请参见https://github.com/goplus/gop/wiki/Commands。

笔记:

gop go -test 将Go +程序包转换为Go程序包,并为每个程序包调用go run /gop_autogen.go并gop run -quiet 比较它们的输出。如果它们的输出不相等,则测试用例失败。
有理数:bigint,bigrat,bigfloat
我们将有理数作为本机Go +类型引入。我们使用后缀r来表示有义文字。例如,(1r << 200)表示一个大int,其值等于2 200。4 / 5r表示有理数常数4/5。

一个 := 1 - [R << 65 // BIGINT,比的int64大 b := 4 / 5 - [R // bigrat Ç := b - 1 / 3 - [R + 3 * 1 / 2 - [R 的println(一个,b,c ^) 地图文字 x := { “ Hello”:1,“ xsw”:3.4 } // map [string] float64 y := { “ Hello”:1,“ xsw”:“ Go + ”} // map [string] interface { } z := {“ Hello ”:1,“ xsw”:3 } // map [string] int 空 := {} // map [string] interface {} 切片文字 X := [ 1,3.4 ] // [] float64 ÿ := [ 1 ] // [] INT ž := [ 1 + 2I,“XSW” ] // []接口{} 一个 := [ 1,3.4,3 + 4i ] // [] complex128 b := [ 5 + 6i ] // [] complex128 c := [ “ xsw”,3 ] // [] interface {} 空 := [] // []界面{} 列表/地图理解 一个 := [ X * X 为 X < - [ 1,3,5,7,11 ]] b := [ X * X 为 X < - [ 1,3,5,7,11 ],X > 3 ]
c := [ i + v for i,v < - [1,3,5,7,11 ],我%2 == 1 ]
d := [ ķ + “” + s ^ 为 ķ,小号 < - { “你好”:“XSW” , “您好”:“去+ “ }]

ARR := [ 1,2,3,4,5,6 ]
È := [[一,b ]为 一个 < - ARR,一个 < b 为 b < - ARR,b > 2 ]

X := { X:我 为 我,X < - [ 1,3,5,7,11 ]} Ŷ := { X:我 为 我,X < - [ 1,3,5,7,11 ],i %2 == 1 } z := { v:k 为 k,v <- { 1:“ Hello ”,3:“ Hi ”,5:“ xsw ”,7:“ Go + ”},k> 3}
对于循环
总结 := 0
为 X < - [ 1,3,5,7,11,13,17 ],X > 3 {
总和 + = X
}
错误处理
我们在Go +中重新发明了错误处理规范。我们称它们为ErrWrap expressions:

expr ! //如果err
expr恐慌?//如果err
expr?则 返回:defval //如果err则使用defval
如何使用它们?这是一个例子:

导入(
“ strconv”

func add(x,y string)(int,error){
返回strconv。阿托(x)?+ strconv。Atoi(y)?,无
}

func addSafe(x,y string)int {
返回strconv。Atoi(x)?: 0 + strconv。Atoi(y)?: 0
}

println(

add(“ 100”,“ 23”):
,add(“ 100”,“ 23”)!)

sum,err := add(“ 10”,“ abc”)
println(

add(“ 10”,“ abc”):
,sum,err)

println(

addSafe(“ 10”,“ abc”):
,addSafe(“ 10”,“ abc”))
该示例的输出为:

add("100", "23"): 123
add("10", "abc"): 0 strconv.Atoi: parsing "abc": invalid syntax

===> errors stack:
main.add("10", "abc")
/Users/xsw/goplus/tutorial/15-ErrWrap/err_wrap.gop:6 strconv.Atoi(y)?

addSafe("10", "abc"): 10
与相应的Go代码相比,它更清晰,更易读。

最有趣的是,返回错误包含完整的错误堆栈。当我们遇到错误时,很容易找到根本原因。

这些是如何ErrWrap expressions工作的?有关更多信息,请参见错误处理。

汽车财产
让我们来看一个用Go +编写的示例:

导入 “ github.com/goplus/gop/ast/goptest”

doc := goptest。新(

... Go +代码...
)!

的println(DOC。任何()。FuncDecl()名称())
在许多语言中,都有一个名为property谁具有get和set方法的概念。

假设我们有get property,上面的示例将是:

导入 “ github.com/goplus/gop/ast/goptest”

doc := goptest。新(

... Go +代码...
)!

的println(DOC。任何。funcDecl。名)
在Go +中,我们引入了一个名为的概念auto property。这是一个get property,但会自动实现。如果我们有一个名为的方法Bar(),那么我们将同时有一个get property具名bar。