Golang源码学习(一)----从0开始学编程

一、Go源码学习的环境搭建    (CentOS_8)
    选择的是CentOS8中最小化安装

    前往家目录 cd
    创建go工作空间  mkdir go
                    cd go
                    mkdir repos
    获取安装包 wget https://dl.google.com/go/go1.16.2.linux-amd64.tar.gz    
    解压安装包 tar zxf go1.16.2.linux-amd64.tar.gz 
    配置go全局变量  echo "export GOROOT=/root/go/go" >> /etc/profile
                    echo "export GOPATH=/root/go/repos" >> /etc/profile
                    echo "export PATH=$PATH:/root/go/go/bin" >> /etc/profile
                    source /etc/profile
    配置go env      go env -w GO111MODULE=on
                    go env -w GOPROXY=https://goproxy.cn

    配置yum源   wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos8_base.repo
                sudo sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
                sudo sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*
                yum clean all
                yum makecache
    
    安装tldr    yum install npm -y
                yum install nodejs -y
                npm install n -g
                n latest
                npm install -g tldr
    
    安装编译调试环境    yum install gcc
                        yum  install gdb


二、go env分析
    · 查看每一个go环境变量的作用  go help environment (有需要可以看看)

    · 依赖模块
        GOROOT="/root/go/go"        // Golang的安装目录
        GOPATH="/root/go/go/repos"  // 工作区目录的绝对地址

        GO111MODULE="on"    // Go moules的开关,开启之后可以不在gopath下运行go
        GOMOD="/dev/null"   // Go mod缓存的地址
        GOPROXY="https://goproxy.cn"    // Go mod下载拉取代理地址
        GOSUMDB="sum.golang.org"    // 校验Go mod的安全性
        GOPRIVATE=""    // 设置的包不走代理、验证
    
    · 编译相关
        GOARCH="amd64"      // 编译环境的架构(交叉编译)
        GOOS="linux"        // 编译环境的操作系统
        GOEXE=""            // 编译后二进制文件的后缀
        GOFLAGS=""          // 默认编译执参数
        GOCACHE="/root/.cache/go-build"     // 缓存的编译结果
        GOBIN=""            // 编译后二进制文件地址
        GOTMPDIR=""         // 临时文件
        GCCGO="gccgo"       // "gccgo"是gcc针对go的优化的通用编译器

    · CGO相关
        CC="gcc"    // 用于编译c代码的编译器
        CXX="g++"   // 用于编译c++代码的编译器
        ....


三、Go原文件结构
    .
    ├── api                 // 由于给一个IDE解析标准的库API的文件
    ...
    ├── bin                 // go的可执行文件,go是所有程序的入口,gofmt会按照go语法解析语法错误
                                (如果有错返回语法错误位置,没错显示go文件内容,不会检测是否程序错误)
    ...
    ├── doc                 // go 使用文档
    ...
    ├── lib                 // 文档模板
    ...
    ├── misc                // 其他的一些工具,相当于大杂烩,大部分是各种编辑器的G哦语言支持,还有cgo的例子等
    ...
    ├── pkg                 // 工具链tools二进制可执行文件,以及依赖的一些头文件与静态类库等
    ...
    ├── src                 // go编译器及标准库源码
    ├── test                // 测试代码
    └── VERSION             // 当前版本


四、Hello World
    · 写一个helloworld的go程序
        vim hello.go
      写入  package main
            import "fmt"
            func main(){
                   fmt.Println("hello,world")
            }
      执行  go run hello.go 
      输出 hello,world
    
    · 自举编译源码  (可以自定义源码啦!!)
        来到GOROOT上级  cd $GOROOT
                        cd ..
        将原来的go编译器作为编译器  mv go goboot
        将编译go的编译器写入配置文件    echo "export GOROOT_BOOTSTRAP=/root/go/goboot" >> /etc/profile
                                        source /etc/profile
        拉取最新的Go源码    git pull https://github.com/golang/go.git   
            (go version devel go1.19-0a1a092c4b Fri May 20 23:37:43 2022 +0000 linux/amd64)
            (后续的源码阅读会默认选择这个版本的源码,选用其他版本会加以注释
            其他版本1:go1.17.8 
            其他版本2:go1.16.2)
        执行编译    cd go/src
                    ./all.bash

    · go build
        · -v    编译时显示包名
        · -p n  开启并发编译,默认情况下该值为CPU逻辑核数
        · -a    强制重新构建
        · -n    打印编译时用到的命令,但是不执行
        · -x    打印编译时用到的命令
        · -race 开启竞争检测

        · go build -n hello.go 可以查看编译器执行的过程
    
    · go install
        Install 编译并安装由导入路径命名的包;
        如果依赖的包没有安装,先由递归深度优先的方式拓扑排序安装依赖的包
    
    · go run
        编译并运行命令源码文件

你可能感兴趣的:(Golang,golang,学习,centos)