Go 语言入门| 豆包MarsCode AI刷题

36 阅读3分钟

本文将从课程样例入手解析,通过比较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
}

这段代码展示了包括结构体定义、结构体初始化、值传递与引用传递、以及基本的函数定义和调用:

  1. 结构体定义(Struct Definition) :

    • 使用type关键字定义结构体。例如,type user struct { name string; password string }定义了一个名为user的结构体,它有两个字段:namepassword,类型都是string
  2. 结构体初始化(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)方法。

  3. 值传递与引用传递(Value Passing vs Reference Passing) :

    • 在Go中,函数参数默认是按值传递的。这意味着,当传递一个变量到函数时,函数接收到的是该变量的一个副本。在checkPassword函数中,uuser类型的一个副本,对u的任何修改都不会影响到原始变量。
    • 引用传递是通过传递变量的指针来实现的。在checkPassword2函数中,u是一个指向user类型的指针,因此函数内部对u指向的值的修改会影响到原始变量。不过,在这个特定的例子中,函数并没有修改u指向的值,只是读取了它。
  4. 函数定义与调用(Function Definition and Call) :

    • 使用func关键字定义函数。函数可以接收多个参数,每个参数都有指定的类型。
    • 函数调用时,传递的参数需要匹配函数定义中的参数类型和数量。

在Go中方法定义直接跟在类型声明之后,不需要额外的修饰符(如 public)。方法调用时,直接通过实例名调用。 而在Java中,方法定义则在类体内,需要指定访问修饰符(如 public)。方法调用时,同样通过实例名调用,但对于引用类型(如对象),可以直接操作对象属性(如果字段是 public 或通过 getter 方法)。

总结

Go 和 Java 在面向对象编程方面有很多相似之处,但 Go 的语法更加简洁,减少了样板代码,更注重于代码的实用性。Java 则提供了更丰富的面向对象特性和严格的类型检查,适合大型项目的开发。

相信通过自身熟悉的语言与Go进行同异分析,有助于我们能更好的理解学习新知识。