Go 语言结构 | 青训营笔记

99 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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拥有强大的标准库

  1. runtime系统调度机制
  2. 高效的GC垃圾回收,1.8版本之后添加了三色标记和混合写屏障。
  3. 丰富的标准库,包括日常开发包含的所有库。

这里记录以下今日所学

关于包,根据本地测试得出以下几点:

  • 文件名与包名没有直接关系,不一定要将文件名与包名定成同一个。
  • 文件夹名与包名没有直接关系,并非需要一致。
  • 同一个文件夹下的文件只能有一个包名,否则编译报错。

文件结构:

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运行程序

image-20220507205713822.png 使用Go build 打包二进制,再运行。

image-20220507205834357.png

此时再执行Go run,原本打好的二进制包并不会消失。

image-20220507205957918.png