最近项目要使用go语言开发一个web程序,由于是第一次使用go开发,就将开发过程中的点滴做个记录吧。
1.安装go
1.1 安装
Ubuntu下安装go语言开发运行环境有如下两种方法
(1)方法一:使用命令
sudo apt install golang-go
(2)方法二:下载go程序包,解压就行
例如:
tar -zxvf go1.19.2.linux-amd64.tar.gz
我按照方法二进行安装,解压后目录结构如下:
目录
1.安装go
1.1 安装
1.2 配置go语言环境变量
2.vscode配置go开发
2.1安装go插件
2.2 Ctrl + Shift + P配置
2.3 创建launch.json配置文件
2.4 设置断点调试
3.编译运行
4.控制台程序
5.http模块开发简单web应用
1.2 配置go语言环境变量
(1)GOPATH
说明:GOPATH 环境变量用来指定开发项目目录,其下一般会建立bin, pkg, src三个目录
(2)GOROOT
说明:GOROOT 用来指定 go 的安装路径
(3)GOBIN程序安装路径
说明:go install 安装应用程序的路径
(4)GOPROXY
说明:GOPROXY是用来设置go mod的代理,以英文逗号“,”分割,使Go在后续拉取模块版本时能够脱离传统的VCS方式从镜像站点快速拉取。它拥有一个默认:https://proxy.golang.org,direct,但proxy.golang.org在中国无法访问,所以建议使用goproxy.cn替代
例如在~/.bashrc中配置如下:
export GOBIN=$HOME/go/bin
PATH=$PATH:$GOBIN:$HOME/go/go/bin
export PATH
export GOROOT=$HOME/go/go
export GOPATH=$HOME/go
export GOPROXY=https://goproxy.cn,direct
安装后可查看go版本:
go version
2.vscode配置go开发
2.1安装go插件
2.2 Ctrl + Shift + P配置
2.3 创建launch.json配置文件
内容如下:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}/first.go"
}
]
}
2.4 设置断点调试
调试成功:配置OK
3.编译运行
golang运行方式有两种,一种是直接运行,另一种是编译成可执行程序,然后再运行,例如程序源文件为first.go,代码如下:
package main
import (
"fmt"
)
func main() {
fmt.Println(123, "hello world", 'A', 12.345)
}
(1) 直接运行
go run first.go
(2) 编译再执行
go build first.go
./first
(3) 安装程序到GOBIN
go install first.go
4.控制台程序
如下代码演示各种变量控制台输出:
package main
import (
"fmt"
"math"
)
/*
Go语言的基本类型有:
bool
string
int、int8、int16、int32、int64
uint、uint8、uint16、uint32、uint64、uintptr
byte // uint8 的别名
rune // int32 的别名 代表一个 Unicode 码
float32、float64
complex64、complex128
*/
func showVar() {
fmt.Println(123, "hello world", 'A', 12.345)
fmt.Printf("%t %c %d %s %f %x %X\n", true, 'A', 123456, "hello go", math.Pi, 10, 12)
//标准声明变量 var 变量名 变量类型
var iInt int
//初始化
iInt = 110
//声明并初始化
var vs string = "声明并初始化"
fmt.Println(iInt, vs)
//批量格式
var (
a int
b string
c []float32
d func() bool
e struct {
x int
}
)
fmt.Println(a, b, c, d, e)
//简短格式: 名字 := 表达式
i, j := 0, 1
fmt.Println(i, j)
//编译器自动推到类型
var it = 100
var st = "hello"
fmt.Println(it, st)
// 格式化控制输出
fmt.Printf("%f\n", math.Pi)
fmt.Printf("%.2f\n", math.Pi)
var vbt bool = true
var vbf bool = false
fmt.Println(vbt, vbf)
}
func showPtrVar() {
var cat int = 1
var str string = "today is wednesday"
ptr := &cat
fmt.Printf("%p %p %p \n", &cat, &str, ptr)
// 打印ptr的类型
fmt.Printf("ptr type: %T\n", ptr)
// 对指针进行取值操作
value := *ptr
// 取值后的类型
fmt.Printf("value type: %T\n", value)
// 指针取值后就是指向变量的值
fmt.Println("value : ", value)
sPtr := &str
fmt.Printf("sPtr type: %T\n", sPtr)
values := *sPtr
//打印字符串
fmt.Printf("values: %s\n", values)
}
func swap1(a *int, b *int) {
t := *a
*a = *b
*b = t
}
func swap2(a, b *int) {
t := *a
*a = *b
*b = t
}
type Point struct {
X int
Y int
}
type Color struct {
R, G, B byte
}
type Player struct {
Name string
HealthPoint int
MagicPoint int
}
type Command struct {
Name string
Ver *int
Comment string
}
// 函数封装实例初始化
func newCommandInstance(name string, varref *int, comment string) *Command {
return &Command{
Name: name,
Ver: varref,
Comment: comment,
}
}
func useStruct() {
/*
type 类型名 struct {
字段1 字段1类型
字段2 字段2类型
…
}
*/
var p Point
fmt.Println(p.X)
p.X = 10
p.Y = 20
fmt.Println(p)
//new关键字实例化
zhangsan := new(Player)
zhangsan.Name = "Canon"
zhangsan.HealthPoint = 300
fmt.Println(zhangsan)
var version int = 1
//取结构体的地址实例化
cmd := &Command{}
cmd.Name = "version"
cmd.Ver = &version
cmd.Comment = "show version"
fmt.Println(cmd)
version = 2
cmd = newCommandInstance(
"path",
&version,
"print file path",
)
fmt.Println(cmd, *cmd.Ver)
}
func main() {
showVar()
showPtrVar()
var a, b int = 111, 222
fmt.Println(a, b)
swap1(&a, &b)
fmt.Println(a, b)
swap2(&a, &b)
fmt.Println(a, b)
useStruct()
}
运行结果如下:
5.http模块开发简单web应用
下面展示使用net/http开发简单的web服务,代码如下:
package main
import "net/http"
type helloHandler struct{}
func (m *helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello world, this is my first golang programe !"))
}
func welcome(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Welcome to golang family !"))
}
func main() {
/*
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello world, this is my first golang programe"))
})
http.ListenAndServe("127.0.0.1:8080", nil)
*/
a := helloHandler{}
server := http.Server{
Addr: "127.0.0.1:8080",
Handler: nil, // 对应DefaultServeMux路由
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello world !"))
})
//使用http.Handle
http.Handle("/hello", &a)
http.Handle("/welcome1", http.HandlerFunc(welcome))
//使用http.HandleFunc
http.HandleFunc("/home", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Go Home!"))
})
http.HandleFunc("/welcome2", welcome)
server.ListenAndServe()
}
启动后程序会监听8080端口,打开浏览器显示如下: