本文将从课程样例入手解析,通过比较GO和Java之间的差异学习简单的结构体写法。 下面先看代码:
package main
import "fmt"
type user struct {
name string
password string
}
func main() {
a := user{name: "wang", password: "1024"}
b := user{"wang", "1024"}
c := user{name: "wang"}
c.password = "1024"
var d user
d.name = "wang"
d.password = "1024"
fmt.Println(a, b, c, d) // {wang 1024} {wang 1024} {wang 1024} {wang 1024}
fmt.Println(checkPassword(a, "haha")) // false
fmt.Println(checkPassword2(&a, "haha")) // false
}
func checkPassword(u user, password string) bool {
return u.password == password
}
func checkPassword2(u *user, password string) bool {
return u.password == password
}
这段代码展示了包括结构体定义、结构体初始化、值传递与引用传递、以及基本的函数定义和调用:
-
结构体定义(Struct Definition) :
- 使用
type关键字定义结构体。例如,type user struct { name string; password string }定义了一个名为user的结构体,它有两个字段:name和password,类型都是string。
- 使用
-
结构体初始化(Struct Initialization) :
- 可以在声明时直接初始化结构体字段,通过指定字段名和值(如
a := user{name: "wang", password: "1024"}),或者仅提供值(如b := user{"wang", "1024"}),后者按字段定义顺序赋值。 - 可以部分初始化结构体,未初始化的字段将使用其类型的零值(对于字符串是
"",对于整数是0等)。例如,c := user{name: "wang"}中,password字段将是空字符串。 - 也可以先声明后逐个字段赋值(如
d.name = "wang"; d.password = "1024")。
相比GO语言,Java通常使用类(class)声明,它包括类访问修饰符、字段声明、构造方法等。初始化对象时,通常通过构造方法或设置器(setter)方法。
- 可以在声明时直接初始化结构体字段,通过指定字段名和值(如
-
值传递与引用传递(Value Passing vs Reference Passing) :
- 在Go中,函数参数默认是按值传递的。这意味着,当传递一个变量到函数时,函数接收到的是该变量的一个副本。在
checkPassword函数中,u是user类型的一个副本,对u的任何修改都不会影响到原始变量。 - 引用传递是通过传递变量的指针来实现的。在
checkPassword2函数中,u是一个指向user类型的指针,因此函数内部对u指向的值的修改会影响到原始变量。不过,在这个特定的例子中,函数并没有修改u指向的值,只是读取了它。
- 在Go中,函数参数默认是按值传递的。这意味着,当传递一个变量到函数时,函数接收到的是该变量的一个副本。在
-
函数定义与调用(Function Definition and Call) :
- 使用
func关键字定义函数。函数可以接收多个参数,每个参数都有指定的类型。 - 函数调用时,传递的参数需要匹配函数定义中的参数类型和数量。
- 使用
在Go中方法定义直接跟在类型声明之后,不需要额外的修饰符(如 public)。方法调用时,直接通过实例名调用。
而在Java中,方法定义则在类体内,需要指定访问修饰符(如 public)。方法调用时,同样通过实例名调用,但对于引用类型(如对象),可以直接操作对象属性(如果字段是 public 或通过 getter 方法)。
总结
Go 和 Java 在面向对象编程方面有很多相似之处,但 Go 的语法更加简洁,减少了样板代码,更注重于代码的实用性。Java 则提供了更丰富的面向对象特性和严格的类型检查,适合大型项目的开发。
相信通过自身熟悉的语言与Go进行同异分析,有助于我们能更好的理解学习新知识。