这篇文章帮助Java程序员快速入门Go语言。 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将详细的描述Go语言的各个构成模块,最后以一个例子来讲解Go语言与Java语言的不同点。 |
yale8848
|
先来认识堆栈(例子)为了满足大家的好奇心,我们将开始于一个麻雀虽小但五脏内全的例子,这个例子将是Stack.java的Go语言版本。 //实现堆栈的包集合 package collection //生成空堆栈 type Stack struct { data []interface{} } //压栈顶 func (s *Stack) Push(x interface{}) { s.data = append(s.data, x) } //弹栈顶,并删除栈顶 //如果是空栈将会引发运行时错误 func (s *Stack) Pop() interface{} { i := len(s.data) - 1 res := s.data[i] s.data[i] = nil // to avoid memory leak s.data = s.data[:i] return res } //返回栈大小 func (s *Stack) Size() int { return len(s.data) }
|
yale8848
|
下面是是使用collection.Stackabstract数据类型的简单例子。
package collection_test import ( collection "." "fmt" ) func Example() { var s collection.Stack s.Push("world") s.Push("hello, ") for s.Size() > 0 { fmt.Print(s.Pop()) } fmt.Println() // Output: hello, world }将测试包package colloection_test和collectionpackage放在同一目录。第一个import声明“.”表示将要用当前路径中的包并同时命名为collection,“fmt”是标准库的包名,没有重新命名,所以就直接用包名fmt即可。 |
yale8848
|
概念上的不同点
|
yale8848
|
语法
声明声明的语法同Java比较是逆向的。你写上名字然后再跟着写类型。从左至右的类型声明也许读起来容易些。
声明一般是采用一个关键字后面跟着被定义对象的名称,这种形式。关键字是const、type、var或者func其中之一。你也可以使用一个关键字后面跟着放在括号之中的一系列声明,这种形式。 var ( n int x float64 ) |
LeoXu
|
当声明函数时,你必须为每个参数提供一个名称,或者不为任何参数提供名称;你不能省略一些参数的名称并提供其它参数的名称。你可以用相同的类型来组织几个名字,例如:
func f(i, j, k int, s, t string)一个变量可以在声明它时初始化值。进行此操作时,可以指定变量的类型,但这并非必需的。当不指定类型时,则默认为初始化表达式的类型。 var v9 = *v2 如果一个变量没有明确地初始化,则必须指定其类型。在这种情况下,它将隐式地初始化为其类型的零值(0,nil 等)。在Go语言中没有其它某些语言中的未初始化的变量。 |
赵亮-碧海情天
|
短声明在函数内,可以用 := 进行短声明,比如: v10 := v1它等效于: var v10 = v1 函数类型在Go语言中,函数是一等公民。Go的函数类型表示有相同的参数和结果类型的所有函数的集合。 type binOp func(int, int) int var op binOp add := func(i, j int) int { return i + j } op = add n = op(100, 200) // n = 100 + 200 |
赵亮-碧海情天
|
多重赋值Go 允许多重赋值。右边的表达式先被求值然后赋给左边的操作数。 i, j = j, i // 交换 i 和 j 的值(不用象传统语言中需要第三个临时变量). 函数可以有多个返回值,用参数括号后面的一个括号中的列表表示。返回值通过赋予一个变量列表来存储,如: func f() (i int, pj *int) { ... } v1, v2 = f() 空标识符空标识符用下划线字符表示,它提供了一种方法来忽略由多值表达式返回的某个值,如: v1, _ = f() // 忽略f()返回的第二个值. |
赵亮-碧海情天
|
分号和格式不需要担心分号和格式,你可以用 gofmt程序创建一个标准的Go样式。虽然这个样式最初看起来或许有点古怪,但它同任何其它样式一样的好,而且熟悉以后会感觉越来越舒服。 在实践中Go代码使用分号不多。严格说,所有的Go语句都是由分号终止。不过,Go在非空白行的末尾隐式插入一个分号,除非该行明显未结束。这带来的影响是,在某些情况下Go不允许换行符。例如,你不能这么写 func g() { // INVALID; "{" should be on previous line. } g()后面会插入一个分号,使它成为一个函数声明,而不是函数定义。类似的,你也不能写 if n == 0 { } else { // INVALID; "else {" should be on previous line. } }后面else前面会插入一个分号,导致语法错误。 |
super0555
|
条件语句Go 不使用括号来包裹 if 语句中的条件,和 for 语句中的表达式, 以及 switch 语句中的值。但另一方面,它必须用花括号来包裹 if 或 for 的执行语句体。 if a < b { f() } if (a < b) { f() } // 不需要括号. if (a < b) f() // 非法(执行体未用花括号括起来) for i = 0; i < 10; i++ {} for (i = 0; i < 10; i++) {} // 非法(表达式不需要括起来)此外,if 和 switch 接受一个可选的初始化语句,通常用它建立一个局部变量,如: if err := file.Chmod(0664); err != nil { log.Print(err) return err } |
赵亮-碧海情天
|
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
有疑问加站长微信联系(非本文作者)