这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记.
Golang语言的优势
首先,Golang拥有极简的部署方式
- 可直接编译成机器码
- 不依赖其他库
- 直接运行即可部署 其次,它是一种静态类型的语言。编译的时候检查出来隐藏的大多数问题。可以在执行前检测出代码中存在的问题“隐患”。 接着,它是语言层面的并发,即天生支持并发。相比于Java语言等其他支持的并发的语言它是在原始的代码中即支持并发,并非如同Java那般需要层层封装才可达成。在者,它的并发切换成本很低,充分利用多核。
这里举两个例子:
这是Java的多线程写法
public class Main {
public static void main(String[] args) throws InterruptedException {
Main main = new Main();
for (int i = 0; i < 10000; i++) {
int finalI = i;
Thread thread = new Thread(() -> {
main.threadRun(finalI);
});
thread.start();
}
}
public void threadRun(int i) {
System.out.println("JavaThread" + i + "...");
}
}
这是Go的写法:
package main
import (
"fmt"
"time"
)
func goFunc(i int) {
fmt.Println("goroutine", i, " ...")
}
func main() {
for i := 0; i < 10000; i++ {
go goFunc(i)
}
time.Sleep(time.Second)
}
相比于代码的可读性而言,Golang的确比Java更容易阅读,而且相比于Java,Golang的底层直接实现并发的所有过程,且效率更高。
最后,Golang拥有强大的标准库。
- runtime系统调度机制
- 高效的GC垃圾回收,1.8版本之后添加了三色标记和混合写屏障。
- 丰富的标准库,包括日常开发包含的所有库。
这里记录以下今日所学:
关于包,根据本地测试得出以下几点:
- 文件名与包名没有直接关系,不一定要将文件名与包名定成同一个。
- 文件夹名与包名没有直接关系,并非需要一致。
- 同一个文件夹下的文件只能有一个包名,否则编译报错。
文件结构:
Test
--helloworld.go
myMath
--myMath1.go
--myMath2.go
测试代码:
// helloworld.go
package main
import (
"fmt"
"./myMath"
)
func main(){
fmt.Println("Hello World!")
fmt.Println(mathClass.Add(1,1))
fmt.Println(mathClass.Sub(1,1))
}
// myMath1.go
package mathClass
func Add(x,y int) int {
return x + y
}
// myMath2.go
package mathClass
func Sub(x,y int) int {
return x - y
}
了解Go run 和Go build的区别
go run : 编译并直接运行程序,不产生可执行文件,只产生临时文件,方便用户调试(即在bin目录和pkg目录不产生任何文件),其后只能+命令源码文件。
go build : 既可以+库源码文件,又可以+命令源码文件,主要功能是检查是否有编译错误
使用 Go run运行程序
使用Go build 打包二进制,再运行。
此时再执行Go run,原本打好的二进制包并不会消失。