沙滩星空的博客沙滩星空的博客

1小时快速入门Go语言

简介

  1. 本文旨在为Go语言初学者提供快速入门指南,从环境安装和设置,到项目编译打包,学会Go开发的流程。
  2. Go语言继承C语言的理念,语法类似,奉行简约风格,没有其他面向对象语言的类和继承的概念。
  3. 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

项目创建

  1. 在新目录初始化本地项目(myproject),生成 go.mod 文件: go mod init myproject
  2. 新建 main.go 入口文件,通过 import 语法导入包,在 func main() 入口函数中编写代码
  3. 更新依赖,生成 go.sum 文件: go mod tidy
  4. 调试运行: go run .
  5. 编译成二进制可执行文件(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工程项目。特点如下:

  1. 一个包一个文件夹,包名通常为小写英文字母,建议和目录名相同。
  2. 包目录下每个go文件首行内容为: package [包名]。如 package main, package model, package service, package webserver
  3. 一个包的函数和变量是共享的,可直接调用。但要被其他包调用,函数名或变量的首字母必须大写
  4. 可编译项目的根目录,必须为main包,且必须存在 func main() 函数作为应用入口。(若项目作为第三方库使用,则无man包和main函数)
  5. 包声明: 在go源码文件首行,使用 package 语句。
  6. 包导入: 在包声明语句下面,使用 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 示例源码。

同步仓库:

Github: https://github.com/iotames/miniutils

Gitee: https://gitee.com/catmes/miniutils


安装go开发环境: https://go.dev/doc/install
未经允许不得转载:沙滩星空的博客 » 1小时快速入门Go语言

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址