简介
- 本文旨在为Go语言初学者提供快速入门指南,从环境安装和设置,到项目编译打包,学会Go开发的流程。
- Go语言继承C语言的理念,语法类似,奉行简约风格,没有其他面向对象语言的类和继承的概念。
- Golang的初步掌握,在于充分理解
指针
和接口
的概念,并灵活使用。
本教程着重Go项目的整体理解和实践,不重点解说变量和函数使用等语法细节
,语法教程资源丰富,请自行在网上扩展学习。
一份源码,处处编译
JAVA以跨平台著称,号称"一次编译,处处运行"。实际上,每台机器,都必须安装JAVA虚拟机能运行。
所以,从跨平台的表现上看,JAVA对比普通脚本语言并无太大优势。
Go和C一样,一份源码,在任意操作系统上,直接编译成二进制可执行文件,便可在其他机器上独立运行。(指运行环境和编译环境一致。如: 在win-x64系统上编译,在win-x64系统上运行)
环境安装
Go安装包下载链接,请以官方显示的不同操作系统平台的Go最新版本链接为准: https://go.dev/dl/
国内网速卡,可使用镜像源: https://mirrors.aliyun.com/golang/
Linux
下载Go文件压缩包并解压,设置Go环境变量
# 下载go环境压缩包,链接可自行替换为最新版本
wget -c https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
# 若国内网络差,下载不来,可以使用阿里镜像源:
# https://mirrors.aliyun.com/golang/go1.21.0.linux-amd64.tar.gz
# 解压缩到/usr/local目录
tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz
# 添加go可执行文件所在的目录到环境变量。
# 可在系统初始化文件 /etc/profile 的最末行添加代码: export PATH=$PATH:/usr/local/go/bin
vim /etc/profile
# 手动执行初始化文件,使得环境变量更改生效
source /etc/profile
# 验证go是否安装成功。
go version
Mac
同Linux
Windows
下载Go环境安装文件,安装结束后,安装程序自动设置Go环境变量
下载并安装文件: https://go.dev/dl/go1.21.0.windows-amd64.msi
打开cmd命令窗口验证go命令: go version
环境设置
查看所有go环境设置项的值: go env
输入如下命令,更改默认设置项以方便后续开发:
# 开启GO111MODULE,方便第三方包的导入
go env -w GO111MODULE=on
# 使用国内Go模块代理,加速第三方包导入速度
go env -w GOPROXY=https://goproxy.cn,direct
项目创建
- 在新目录初始化本地项目(
myproject
),生成go.mod
文件:go mod init myproject
- 新建
main.go
入口文件,通过import
语法导入包,在func main()
入口函数中编写代码 - 更新依赖,生成
go.sum
文件:go mod tidy
- 调试运行:
go run .
- 编译成二进制可执行文件(
myproject.exe
):go build .
main.go
文件示例(提取百度首页热搜):
最新源码: https://github.com/iotames/miniutils/tree/main/examples/myproject
package main
import (
"fmt"
"log"
"github.com/iotames/miniutils"
)
func main() {
// 构建HTTP请求(默认GET方法)
req := miniutils.NewHttpRequest("https://www.baidu.com")
// 设置HTTP请求头
req.SetRequestHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.81 Safari/533.33")
// 执行HTTP请求
err := req.Do(nil)
if err != nil {
log.Println(err)
return
}
body := string(req.BodyBytes)
// 提取网页中,以`<span class="title-content-title">`字符串开头,`</span>` 字符串结尾的所有字符串片段。
strfind := miniutils.NewStrfind(body).SetRegexpBeginEnd(`<span class="title-content-title">`, `</span>`)
hots := strfind.DoFind().GetAll(false)
hotsMsg := "百度热搜:\n"
for i, v := range hots {
hotsMsg += fmt.Sprintf("[%d]----->[%s]\n", i, v)
}
log.Println(hotsMsg)
}
运行结果:
----RequestBegin---GET: https://www.baidu.com -------------------------------------------
User-Agent: [Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.81 Safari/533.33]
----RequestEnd---(200 OK)----------------------
2022/11/18 14:59:21 百度热搜:
[0]----->[“两个全球倡议”有何含义]
[2]----->[携手应对挑战 加快经济复苏]
[2]----->[新华社:一封了之、一放了之要不得]
[3]----->[张伯礼:奥密克戎难以彻底消灭]
[4]----->[31省份昨日新增本土2276+22853]
[5]----->[女子戴隐形10年角膜长满新生血管]
至此,一个简单的 Hello Word 应用程序编写完成, 用于提取百度首页的热搜关键词.
程序编译成独立的可执行文件: myproject.exe
(Linux或Mac系统文件名为myproject
).
请打开命令行窗口执行:
- Windows:
myproject.exe
- Linux:
./myproject
Linux系统若报权限问题,请先赋予文件可执行权限: chmod +x myproject
语法特性
package 包
Go语言使用包(package)来组织golang工程项目。特点如下:
- 一个包一个文件夹,包名通常为
小写英文字母
,建议和目录名相同。 - 包目录下每个go文件首行内容为:
package [包名]
。如package main
,package model
,package service
,package webserver
- 一个包的函数和变量是共享的,可直接调用。但要被其他包调用,函数名或变量的
首字母必须大写
。 - 可编译项目的根目录,必须为main包,且必须存在
func main()
函数作为应用入口。(若项目作为第三方库使用,则无man包和main函数) 包声明
: 在go源码文件首行
,使用package
语句。包导入
: 在包声明
语句下面,使用import
语法导入,使用/
符号连接不同文件夹的包名。
- 官方标准包:
fmt
,runtime
,encoding/json
,net/http
- 本地包:
包导入
格式本地项目名/本地包名
,如myproject/model
,myproject/webserver/data
- 远程包:
golang.org/x/net/html
,github.com/iotames/miniutils
,xorm.io/xorm
循环语句
Go基础语法
在线练习: https://go.dev/play/
- for语句
result := ""
for i := 'a'; i <= 'g'; i++ {
result += fmt.Sprintf("%c", i)
}
fmt.Println(result) // 输出 "abcdefg"
result := ""
for i := 0; i <= 5; i++ {
result += fmt.Sprintf("%d", i)
}
fmt.Println(result) // 输出 "012345"
- for range 语句
mapstr := map[string]string{"a":"aa11", "b":"bb22"}
result := ""
for k, v := range mapstr {
result += fmt.Sprintf("%s->%s", k, v)
}
fmt.Println(result) // 输出 "a->aa11b->bb22"
sliceStr:= []string{"aa11", "bb22"}
result := ""
for i, v := range sliceStr {
result += fmt.Sprintf("%d->%s", i, v)
}
fmt.Println(result) // 输出 "0->aa111->bb22"
教程源码
本教程调用库 miniutils
,对日常开发的常见功能进行封装,不依赖其他第三方库,包含 examples 示例源码。
同步仓库:
安装go开发环境: https://go.dev/doc/install