1. Go语言概述
Go是一种开源的编程语言,由Google开发,于2009年发布。它设计简洁、高效、并发,适合构建高性能的服务器端应用。Go语言具有垃圾回收、类型安全、内存安全等特性,同时保持了C语言的执行效率。更多学习教程www.fgedu.net.cn
2. Go环境搭建
搭建Go开发环境需要安装Go编译器和相关工具。
# wget https://dl.google.com/go/go1.18.3.linux-amd64.tar.gz
# 解压Go
# tar -C /usr/local -xzf go1.18.3.linux-amd64.tar.gz
# 配置环境变量
# vi /etc/profile
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
# 使环境变量生效
# source /etc/profile
# 验证安装
# go version
go version go1.18.3 linux/amd64
# 检查Go环境
# go env
GO111MODULE=”on”
GOARCH=”amd64″
GOBIN=””
GOCACHE=”/root/.cache/go-build”
GOENV=”/root/.config/go/env”
GOEXE=””
GOEXPERIMENT=””
GOFLAGS=””
GOHOSTARCH=”amd64″
GOHOSTOS=”linux”
GOINSECURE=””
GOMODCACHE=”/root/go/pkg/mod”
GONOPROXY=””
GONOSUMDB=””
GOOS=”linux”
GOPATH=”/root/go”
GOPRIVATE=””
GOPROXY=”https://goproxy.cn,direct”
GOROOT=”/usr/local/go”
GOSUMDB=”sum.golang.org”
GOTMPDIR=””
GOTOOLDIR=”/usr/local/go/pkg/tool/linux_amd64″
GOVCS=””
GOVERSION=”go1.18.3″
GCCGO=”gccgo”
GOAMD64=”v1″
AR=”ar”
CC=”gcc”
CXX=”g++”
CGO_ENABLED=”1″
GOMOD=”/dev/null”
GOWORK=””
3. Go基础语法
Go基础语法包括变量、数据类型、运算符、控制语句等基本元素。学习交流加群风哥微信: itpux-com
package main
import “fmt”
func main() {
fmt.Println(“Hello, Go!”)
}
// 运行程序
# go run main.go
Hello, Go!
// 编译程序
# go build main.go
# ./main
Hello, Go!
// 变量声明
var name string = “John”
var age int = 30
var isAdmin bool = true
// 短变量声明
name := “John”
age := 30
isAdmin := true
// 数据类型
var str string = “Hello”
var num int = 42
var floatNum float64 = 3.14
var boolVal bool = true
var arr [3]int = [3]int{1, 2, 3}
var slice []int = []int{1, 2, 3}
var m map[string]int = map[string]int{“a”: 1, “b”: 2}
// 控制语句
if age >= 18 {
fmt.Println(“Adult”)
} else {
fmt.Println(“Minor”)
}
// 循环
for i := 0; i < 5; i++ {
fmt.Println(i)
}
// 遍历切片
for index, value := range slice {
fmt.Printf("Index: %d, Value: %d\n", index, value)
}
4. Go函数
Go函数是代码复用的基本单位,可以接受参数并返回值。
func add(a, b int) int {
return a + b
}
// 多返回值
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, fmt.Errorf(“division by zero”)
}
return a / b, nil
}
// 命名返回值
func calculate(a, b int) (sum, product int) {
sum = a + b
product = a * b
return
}
// 调用函数
func main() {
result := add(1, 2)
fmt.Println(result)
quotient, err := divide(10, 2)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(quotient)
}
sum, product := calculate(3, 4)
fmt.Printf(“Sum: %d, Product: %d\n”, sum, product)
}
5. Go结构体
Go结构体是一种复合数据类型,用于组合多个字段。学习交流加群风哥QQ113257174
type Person struct {
Name string
Age int
Email string
}
// 方法定义
func (p Person) Greet() string {
return fmt.Sprintf(“Hello, my name is %s”, p.Name)
}
// 指针接收器
func (p *Person) SetAge(age int) {
p.Age = age
}
// 使用结构体
func main() {
// 创建结构体实例
person := Person{Name: “John”, Age: 30, Email: “john@fgedu.net.cn”}
// 访问字段
fmt.Println(person.Name)
fmt.Println(person.Age)
// 调用方法
fmt.Println(person.Greet())
// 调用指针接收器方法
person.SetAge(31)
fmt.Println(person.Age)
}
6. Go接口
Go接口是一种类型,定义了一组方法签名,任何类型只要实现了这些方法就自动实现了该接口。更多学习教程公众号风哥教程itpux_com
type Animal interface {
Speak() string
}
// 实现接口的类型
type Dog struct {
Name string
}
func (d Dog) Speak() string {
return “Woof!”
}
type Cat struct {
Name string
}
func (c Cat) Speak() string {
return “Meow!”
}
// 使用接口
func main() {
var animal Animal
animal = Dog{Name: “Buddy”}
fmt.Println(animal.Speak())
animal = Cat{Name: “Whiskers”}
fmt.Println(animal.Speak())
}
7. Go并发编程
Go语言内置支持并发,使用goroutine和channel实现。
func sayHello() {
fmt.Println(“Hello from goroutine”)
}
func main() {
// 启动goroutine
go sayHello()
// 主goroutine等待
time.Sleep(1 * time.Second)
fmt.Println(“Hello from main”)
}
// Channel
func main() {
// 创建channel
ch := make(chan int)
// 启动goroutine发送数据
go func() {
ch <- 42 // 发送数据到channel
}()
// 从channel接收数据
value := <-ch
fmt.Println(value)
}
// 带缓冲的channel
func main() {
// 创建带缓冲的channel
ch := make(chan int, 2)
// 发送数据
ch <- 1
ch <- 2
// 接收数据
fmt.Println(<-ch)
fmt.Println(<-ch)
}
8. Go包管理
Go使用go mod进行包管理,用于管理依赖关系。
# go mod init fgedu.net.cn/myapp
# 安装依赖
# go get github.com/gin-gonic/gin
# 查看依赖
# go list -m all
# 更新依赖
# go get -u
# 清理依赖
# go mod tidy
# 构建应用
# go build
# 运行应用
# go run main.go
9. Go Web开发
Go可以用于构建Web应用,使用标准库或第三方框架。
package main
import (
“fmt”
“net/http”
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “Hello, Go Web!”)
}
func main() {
http.HandleFunc(“/”, helloHandler)
fmt.Println(“Server running at http://fgedudb:8080/”)
http.ListenAndServe(“:8080”, nil)
}
// 使用Gin框架
# 安装Gin
# go get github.com/gin-gonic/gin
package main
import “github.com/gin-gonic/gin”
func main() {
r := gin.Default()
r.GET(“/”, func(c *gin.Context) {
c.JSON(200, gin.H{
“message”: “Hello, Gin!”,
})
})
r.GET(“/api/users”, func(c *gin.Context) {
c.JSON(200, []gin.H{
{“id”: 1, “name”: “John”},
{“id”: 2, “name”: “Alice”},
})
})
r.Run(“:8080”)
}
10. Go开发最佳实践
Go开发的最佳实践包括代码风格、性能优化、错误处理等方面。author:www.itpux.com
// 使用gofmt格式化代码
# go fmt
// 使用golint检查代码
# go get -u golang.org/x/lint/golint
# golint
// 错误处理
func readFile(filename string) ([]byte, error) {
data, err := ioutil.ReadFile(filename)
if err != nil {
return nil, fmt.Errorf(“read file %s: %w”, filename, err)
}
return data, nil
}
// 性能优化
// 使用sync.Pool复用对象
var bufferPool = sync.Pool{
New: func() interface{} {
return &bytes.Buffer{}
},
}
func processData(data []byte) {
buf := bufferPool.Get().(*bytes.Buffer)
defer bufferPool.Put(buf)
buf.Reset()
// 使用buf处理数据
}
// 代码组织
// 项目结构
/myapp
/cmd
/myapp
main.go
/internal
/config
/handler
/service
/repository
/pkg
/utils
go.mod
go.sum
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
