Go语言入门指南:基础语法和常用特性解析 | 豆包MarsCode AI刷题

125 阅读3分钟

Go的结构体

go 的结构体与 c 很像,我以为我可以看一眼就理解与结构体有关的用法,但是我大意了,go 的结构体的 get ,set 方法的结构初次在我眼前亮相的时候有亿点懵逼,为什么形参可以分布的这么离散,方法名的左边也有,右边也有🤣

go 的结构体的创建就不多讲了,因为和 c 语言及其类似,无非就是语法上 go 的变量类型在变量名的右边这一点点区别。

对于结构体变量的赋值语法来说,也很容易理解:

type user struct {
    name     string
    password string
}
  • 在创建变量时赋值:
    • 直接给结构体里的所有属性赋值(类似 java 里的全参构造)
    a := user{name: "wang", password: "1024"}
    
    • 只给部分属性赋值,未赋值的部分会自动赋上它们的零值
    a := user{name: "wang"}
    
    • 不通过属性名:值的方式,直接属性按顺序赋值
    a := user{"wang", "1024"}
    

    这种方法必须将全部属性赋值,否则报错

  • 在创建变量后赋值:
    • 通过 . 的方式给变量的属性进行赋值,也可以用来修改属性的值(显而易见对吧)
    a := user{name: "wang"}
    a.password = "1024"
    
    var b user;
    b.name = "wang"
    b.password = "1024"
    

结构体方法 + 指针

其实我真正想聊的是这部分,第一次看到下面这种写法的时候真的有点懵逼:

func (u user) checkPassword(password string) bool {
	return u.password == password
}

func (u *user) resetPassword(password string) {
	u.password = password
}

一开始我把 (u user)当成了这个方法的返回类型,但是又想到 go 里的类型不都应该在左边吗???所以这个是什么?脑子里浮现出那首歌,小朋友,你是否有很多问号……

后来通过网上查阅以及通过 java 触类旁通,了解到 (u user) 就类似于 this 关键字,哪个变量调用这个方法,u 就代表哪个变量。

  • (u user)这个参数可以叫做值接收者,这里的 u 只是原变量的一个副本,方法内部的操作不会对原变量产生影响
  • (u *user)这个参数可以叫做指针接收者,很显然,这个变量可以通过指针访问到原变量的属性值并修改,很适合做赋值操作

在拷贝大型结构体时也可使用指针操作,因为相比于创建一个较大的副本来说,可以直接访问原变量何乐而不为呢

关于 printlnfmt.Println

在使用 goLand 练习时,由于初学 go 的语法,道听途说 go 是 c 和 python 的结合,所以在打印输出的时候下意识的直接使用 println 作为输出语句(因为 java 里也有 System.out.println 方法,顺手就写成这样了,大杂烩了属于是🤣),然后我就发现通过 println 输出的语句是红色的。

image.png

经过网上查询了解到:

在 Go 语言中,printlnfmt.Println 是不同的输出方式:

  • **println** 是 Go 语言的内置函数,直接调用了 Go 运行时的标准输出,输出风格和行为取决于 IDE 或运行环境的配置,有时在某些环境中会显示为红色。
  • **fmt.Println**fmt 包中的函数,输出更常用于标准控制台,且通常显示为正常颜色(比如白色或默认控制台颜色),不会受 IDE 的特殊显示影响。

算是练习时的有趣发现?Maybe有趣。但还是尽量用 fmt 库的方法吧,因为在 豆包里它不支持这么输出🤫