因为我要往架构方向靠拢啊。
关于架构,其实架构的书我看了《架构整洁之道》,也有《实现驱动领域设计》。但是我感觉明显还不够,所以我在极客时间买了一个架构相关的专栏,这个专栏写的编程语言是 go,为了更好的学习与理解,所以才有这个系列。
我在使用vscode进行go编程时,总会显示一下警告
type Service struct {
a *ClassName
}
exported type Service should have comment or be unexported
gopls
//Service 服务类
"go.lintFlags":["--disable=all"]
golang 的编码习惯有个很有意思,就是它的所有变量、方法、类 等等在代码的末句全都不需要打分号,就算你打了分号,编辑器一样也会给你自动省略
怎么导入第三方库?直接在官方仓库地址选择自己要导入的模块,地址见:https://pkg.go.dev
import ("moduleName")
shift + command + pGo: Add Import
expected ';', found fLF/CRLFCRLF/LF
接下来就是各种变量函数的基本用法介绍了
null 值:golong 用 nil 代表 null,这个很特别啊,大多数语言都是 null
type ClassName struct{ someField int}
var scopeVar = "string"var scopeVar string = ""
localVar := ""var localVar string = ""
golong 具有指针概念
var p *int
这个跟 c++ 的指针是一样的,比较复杂,当时上大学的我上课上到这个地方的时候很懵,什么“指针”,“指针的引用”,“指针的指针”,“ * ”,“ & ” 等总是搞不清楚。在用 vc++ 6.0 时代下,编写代码没有任何提示,简直是难如登天。
但是现在时代不同啦,ide/编辑器 可以自动帮你做正确的选择。这次偶然的机会学习 golang,不过我还是有必要把这地方的知识弄清楚。
首先看下面代码,我把注释写在边上
var p *int // 变量 p 代表是整形的内存地址
i := 11 // 就一般的变量赋值
p = &i // 给内存地址指针变量 p 赋值 11 的指针变量
*p = 1 // p 地址的值赋值为 1
第二行我就不解释了。
第一行代码就是定义一个指向整形的内存地址的变量 p。
第三行代码表示你要给一个整形的地址赋值,那么肯定不是直接赋值一个整数 i,而是这个变量 i 指向的整数的地址 &i。其实可以理解为 i 的一个引用。
第四行我要直接给 p 指针指向的地址具体的值,那就是我们之前说的 “指针的指针:*p = 1”。
函数申明函数在 golang 里面同 js 是一样 —— 一等公民。也就是你无论写在哪里,它都是可以在当前域是有效,可以引用的。
函数申明分两种
func SomeMethod() {}func SomeMethod(a int) {}func SomeMethodAndReturn() ReturnValue {}
函数这里面有个好玩的约定:
- 函数名首字母是小写就是 private 私有方法
- 函数名首字母是大写则是 public 共有方法
我们还可以定一个函数类(函数类就相当于 C# 的委托,委托对于 CLR 而言就是一个含有这么一个函数的类,也可以当做 Java 中的内部类处理)。实例代码如下所示
type delegateFunc func(string) // 定一个委托
func serve(msg string){
fmt.Printf(msg)
}
func main(){
d := delegateFunc(serve) // 把函数当作参数传递
d("marson shine")
}
方法定义
func (type类型参数) MethodName(parameters) ReturnValue {}
一个 type 指定的类型可以关联方法集。一个接口类型的方法集是其接口。任何类型 T 的方法集,由它作为接收器接收所有方法。对应的指针类型 *T 的方法集是由接收器 *T 或者是 T 申明的方法集(那也就说,它包含了 T 的所有方法集)。更多的规则运用在包含那些匿名字段的结构(struct)上。任何类型都有空的方法集。在一个方法集中,每个方法必须有一个唯一的不为空的名称。
我们举个例子来说明:
func (typeName ClassName) MethodName(parameter string) string {
}
这里我们定义了一个方法,指定的接收器就是 ClassName 类型,即我们得先有个接收器,才能有这个方法集 MethodName
type ClassName struct {
userName string
}
那么这个时候我就可以出实话一个 ClassName,然后就可以调用方法 MethodName 了。
对于上面的方法定义,其实还有一种写法是这样的:
func (typeName *ClassName) MethodName(parameter string) string {
}
func (typeName ClassName) MethodName(parameter string) string {}