Go的入门

一、GO简介

Go语言(也叫 Golang)是Google开发的开源编程语言。

1. 语言特性

Go 语法简洁,上手容易,快速编译,支持跨平台开发,自动垃圾回收机制,天生的并发特性,更好地利用大量的分布式和多核的计算机。简单来说:Go语言实现了开发效率与执行效率的完美结合,具有媲美C语言的运行速度,又具有与Python,Java语言相近开发效率。

2. 语法特点

Go 语言支持指针,引入协程(goroutine)实现并发,通过Channel实现协程间通讯,函数方法支持多个返回值,通过 recover 和 panic 来替代异常机制,从1.18版本开始支持泛型;

没有类概念,通过结构体和interface实现面向对象,不支持函数重载,不支持隐式转换,不支持三元运算符,不支持静态变量,
不支持动态链接库和动态加载代码;

二、安装配置

百度自行查询

并设置对应的环境变量。具体SDK库使用见官网标准库文档,三方中文文档:https://studygolang.com/pkgdoc

#查看版本
go version

#查看Go环境变量
go env 

查看所有命令:

go help 

main.go 源文件如下:

package main

import "fmt"

func main() {
    fmt.Println("Hello, 世界")
}

编译

#编译 输出可执行文件.exe
go build helloworld.go 
#编译并运行
go run helloworld.go

工程化

Go 官方在1.11开始推出了Go Modules的功能,配置GO111MODULE=auto 启用,1.13版本默认启动,用于go项目得依赖管理

设置代理:

go env -w GOPROXY=https://goproxy.cn

常用代理:阿里云(https://mirrors.aliyun.com/goproxy/ )七牛云(https://goproxy.cn),https://goproxy.io

#创建目录
mkdir hello
cd hello
#初始化工程
go mod init example/hello

# 下载依赖包
go get github.com/robfig/cron@v1.2.0
go get github.com/google/uuid@v1.3.0  #下载$GOPATH/pkg/mod目录下

输出:
go.mod 文件标记每个依赖包的版本

module example/hello  
go 1.15

require (
    github.com/google/uuid v1.3.0
    github.com/robfig/cron v1.2.0
)

go.sum 文件记录每个依赖包的哈希值

github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=

正常情况下,每个依赖包版本会包含两条记录:

  • 第一条记录为该依赖包版本整体(所有文件)的哈希值
  • 第二条记录仅表示该依赖包版本中go.mod文件的哈希值

go.mod只需要记录直接依赖的依赖包版本,只在依赖包版本不包含go.mod文件时候才会记录间接依赖包版本; go.sum则是要记录构建用到的所有依赖包版本, go.sum文件中记录的依赖包版本数量往往比go.mod文件中要多

GOSUMDB 环境变量标识checksum database,用于依赖包版本写入go.sum 文件之前进行二次校验

go不允许循环依赖(包A>包B>包C>包A)

早期GOPATH工作区方式,GOPATH包含三个子目录:

  • src 存放源代码的位置
  • pkg 存储预编译目标文件的地方,以加速程序的后续编译
  • bin 编译后的二进制文件的位置
    引入三方套件,先查找目录GOPATH/src没有再查找目录GOROOT/src,如果没找到就报错了,虽然有一些第三方的包管理工具比如:Vendor、Dep,但是并不好用

引入本地包

module example/hello  
go 1.15

require (
    github.com/google/uuid v1.3.0
    github.com/robfig/cron v1.2.0
        example/greeting v1.0.0 //indirect  
)
//replace 将远程包替换为本地包服  模块名=>模块路径
replace example/greeting => ../greeting

//indirect 不能省略

包管理

  • 文件夹名与包名没有直接关系,并非需要一致,但建议一致
  • 同一个文件夹下的文件只能有一个包名(即一个目录内只能有一个包名)
  • import 两个同名包时,可以设置别名区分
import (
    "example/hello/com/greeting"  //   模块名+包路径
        _ "example/hello/com/math"  //匿名(可以不使用),促发包内init()方法
        myMath "example/hello/com/math"  //设置别名
    "fmt"
)
func main() {
    greeting.Say()  //包名.方法名
    fmt.Println("hello world")
}

访问控制

以首字母大小写进行变量、方法、函数得访问控制

  • 首字母大写,公开的
  • 首字母小写,包级私有的,只能包内访问
  • internal代码包内,首字母大写的,模块级私有(go 1.4版本)
    只能该代码包得 直接父包及其子包中的代码引用

相关推荐

  1. Go入门

    2024-07-20 12:32:05       32 阅读
  2. Go语言入门Go程序流程控制语句】

    2024-07-20 12:32:05       52 阅读
  3. Go语言入门Go程序基础结构

    2024-07-20 12:32:05       51 阅读
  4. Go语言入门Go语言方法,函数,接口】

    2024-07-20 12:32:05       58 阅读
  5. Go语言入门Go语言数据结构】

    2024-07-20 12:32:05       62 阅读
  6. Go 入门

    2024-07-20 12:32:05       47 阅读
  7. Go入门:探索编程奇妙世界

    2024-07-20 12:32:05       60 阅读
  8. Go】五、Grpc 入门使用

    2024-07-20 12:32:05       40 阅读
  9. 【Golang入门教程】Go语言变量声明

    2024-07-20 12:32:05       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 12:32:05       106 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 12:32:05       116 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 12:32:05       95 阅读
  4. Python语言-面向对象

    2024-07-20 12:32:05       103 阅读

热门阅读

  1. SOME/IP配置文件SD中ttl单位是秒

    2024-07-20 12:32:05       24 阅读
  2. Android 14 适配之 - 隐式/显示 Intent 和 广播适配

    2024-07-20 12:32:05       21 阅读
  3. IT服务规划设计之PDCA

    2024-07-20 12:32:05       28 阅读
  4. python-nameparser,一个超酷的Python库!

    2024-07-20 12:32:05       29 阅读
  5. am start -W 命令详解-可以测量应用启动时间的命令

    2024-07-20 12:32:05       24 阅读
  6. 很详细!接口使用教程(二)

    2024-07-20 12:32:05       31 阅读
  7. 分布式Session共享的5类技术方案,与优劣势比较

    2024-07-20 12:32:05       24 阅读