Go系列-入门01

背景

近期换了新的工作,新公司的主要技术栈使用的Go,当然我也是为了挑战自身,从之前的Java转型到go,来看看更广阔的技术世界。写一些学习心得来记录自己的总结和反思。

结构体方法

这是初学go的时候,最让人困惑的地方。一个方法既有入参,又有返回值,为什么还来了一个接受者。但无论如何,go的函数支持这种格式,struct+func的这种方法,似乎等价于Java中的class里的method。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package learning

type Student struct {
Name string
Number string
}

func (s *Student) GetName() string {
return s.Name
}

func (s *Student) SetName(name string) {
s.Name = name
}
1
2
3
4
5
6
7
8
9
10
11
12
13
package main

import (
"fmt"
"qyd/first/eg/learning"
)

func main() {
student := learning.Student{"Camel", "0001"}
fmt.Println(student)
student.SetName("Camel2")
fmt.Println(student)
}

值传递

go仅支持值传递,这是个好事,也不是个好事。
java中基于基本类型和复合类型分为值传递和引用传递,go中如果要实现引用传递修改参数内容,可以明确使用指针,这确实比较清晰。
说这个不是好事,无非在一些场景,你需要仔细考虑使用指针的场景。例如上述的结构体函数,在进行修改等动作的时候,是否要影响结构体本身的参数值,是在开发的时候要斟酌的。

另外要补充的一点,基本类型的值不可能为null,也就是不能为nil。nil只能赋值给pointers, interfaces, channels, slices, maps and function,表示一种还没有初始化的状态。

go工具箱

go是使用多种命令来进行项目的构建,包的引用等。目前使用比较多的是go get,go build,go install,go mod。而且很神奇的一点,go mod可以灵活依赖任意go module,并且可以随意依赖github上的代码,十分刺激,简直天生开源。

面向对象

可能目前写go的感触还不是很深,现在只能用面向过程的编程方式来理解go的玩法。似乎结构体可以比较好的解决这个问题,但是代码写起来还是挺怪的。(通过定义结构体的方式来定义出来java里的各种service?)

包括注入等玩法,似乎也支持,只是自己没有学习的特别深入。

推荐文章