golang标准库和第三方框架超详细使用指南_golang使用第三方库

}

4.6 json包:JSON处理

encoding/json包是Go语言中处理JSON数据的库。

encoding/json包主要函数有:Unmarshal、Marshal、MarshalIndent、NewEncoder、NewDecoder等

以下是go json包的使用示例

package main

import (
“encoding/json”
“fmt”
)

func main() {
// 编码,将结构体转换为JSON格式的字符串
type Person struct {
Name string json:"name"
Age int json:"age"
Address string
}
p := Person{Name: “John”, Age: 20, Address: “Hangzhou”}
b, err := json.Marshal§
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(b))

// 解码,将JSON格式的字符串转换为结构体
var p2 Person
err = json.Unmarshal([]byte({"name":"John","age":20,"address":"Hangzhou"}), &p2)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(p2.Name, p2.Age, p2.Address)
}

4.7 http包:HTTP处理

Go的http包是Go语言中处理HTTP协议的库1。

http包有两个核心功能:Conn和ServeMux1。

  • Conn:goroutine与一般编写的http服务器不同,Go为了实现高并发和高性能,使用了goroutines来处理Conn的读写事件,这样每个请求都能保持独立,相互不会阻塞,可以高效的响应网络事件。
  • ServeMux:自定义的锁(sync.RWMutex),由于请求涉及到并发处理,因此这里需要一个锁机制。

以下是Go http包的使用示例:

package main

import (
“fmt”
“net/http”
)

func sayhello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, “Hello, Go!”)
}

func main() {
http.HandleFunc(“/”, sayhello)
http.ListenAndServe(“:9090”, nil)
}

4.8 reflect包:反射机制

reflect包是Go语言中用于运行时反射的库。

reflect包主要提供了以下功能:对变量进行反射,获取变量的值、类型信息、修改变量的值以及调用变量的方法

以下是reflect包的部分使用示例:

package main

import (
“fmt”
“reflect”
)

type Person struct {
Name string
Age int
}

func main() {
p := Person{Name: “Tom”, Age: 18}
value := reflect.ValueOf§
fmt.Println(value.FieldByName(“Name”).String()) // 输出:Tom
fmt.Println(value.FieldByName(“Age”).Int()) // 输出:18
fmt.Println(value.Type().Field(0).Name) // 输出:Name
fmt.Println(value.Type().Field(1).Name) // 输出:Age
fmt.Println(value.Type().Method(0).Name) // 输出:String

value.FieldByName(“Name”).SetString(“Jerry”) // 修改Name字段的值为Jerry
fmt.Println(value.FieldByName(“Name”).String()) // 输出:Jerry
}

4.9 error包:错误处理

errors包是Go语言中处理错误的一个标准库。

errors包提供的主要功能有:创建错误对象、判断错误类型、转换错误类型

创建错误对象使用errors.New()函数,该函数接收一个字符串参数,返回一个error类型的值。

err := errors.New(“something went wrong”)

判断错误类型使用errors.Is()函数,该函数接收两个参数,一个是错误对象,另一个是目标错误类型,返回一个布尔值 。

err := errors.New(“invalid input”)
err1 := errors.New(“invalid input”)
fmt.Println(errors.Is(err1, err)) // 输出 false

转换错误类型使用errors.As()函数,该函数接收两个参数,一个是错误对象,另一个是目标类型,返回一个布尔值。

type MyError struct {
Code int
Msg string
}

err := &MyError{Code: 123, Msg: “something went wrong”}
var target *MyError

if errors.As(err, &target) {
fmt.Println(target)
} else {
fmt.Println(“err is not of type *MyError”)
}

4.10 sync包:同步机制

sync包是Go语言中提供的一些简单的同步原语。

sync包中常用的类型有Mutex、RWMutex、WaitGroup

  • Mutex是互斥锁,提供了Lock和Unlock两个方法,用于保护临界区,同一时间只有一个goroutine能够获取锁并执行临界区代码。
  • RWMutex是读写锁,分为读锁和写锁,多个goroutine可以同时持有读锁,但只能有一个goroutine持有写锁。
  • WaitGroup用于等待一组goroutine完成。

以下是使用sync包的示例代码:

package main

import (
“fmt”
“sync”
)

func main() {
var mu sync.Mutex
var wg sync.WaitGroup
var rwmu sync.RWMutex
var count int

for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
mu.Lock()
defer mu.Unlock()
count++
}()
}

wg.Wait()
fmt.Println(“count:”, count)

for i := 0; i < 10; i++ {
if i%2 == 0 {
go func() {
defer rwmu.RUnlock()
rwmu.RLock()
fmt.Println(“data:”, data)
}()
} else {
go func() {
defer rwmu.Unlock()
rwmu.Lock()
data = “pidancode.com”
}()
}
}
}

五、常用第三方库和框架
5.1 Gin:用于创建Web应用

gin是一个使用Go语言实现的HTTP Web框架,具有快速、灵活和容错方便等特点。

gin的优点

  1. 封装优雅,API友好。
  2. 源码注释明确。
  3. 发布1.0版本。
  4. 快速灵活,容错方便。
  5. 支持中间件机制。
  6. 可以捕获panic并恢复。
  7. 支持解析并验证请求的JSON。

gin的使用示例:

package main

import (
“net/http”
“gopkg.in/gin-gonic/gin.v1”
)

func main() {
r := gin.Default()
r.GET(“/ping”, func(c *gin.Context) {
name := c.Query(“name”)
c.String(http.StatusOK, “Hello %s”, name)
})
r.Run(“:8080”)
}

5.2 Gorm:用于数据库访问

Gorm是Go语言的ORM库,它具有丰富的功能和良好的扩展性

Gorm提供了许多方便的方法和功能,例如:

  • 查询所有对象:varusers[]User; result:=db.Find(&users)
  • 指定查询条件(where):db.Where(&User{Name:"jinzhu"},"name","Age").Find(&users)
  • 限制返回数量:db.Limit(10).Offset(5).Find(&users)
  • 查询部分字段:db.Select("name","age").Find(&users)
  • 查询排序:db.Order("age desc, name").Find(&users)

Gorm使用示例:

package main

import (
“gorm.io/driver/mysql”
“gorm.io/gorm”
“gorm.io/gorm/logger”
)

type User struct {
ID uint gorm:"primarykey"
Name string gorm:"column:name"
Age uint gorm:"column:age"
}

func main() {
// 连接数据库
dsn := “user=test password=ZHOUjian.22 host=121.36.43.223 port=3306 dbname=cmdb”
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(“failed to connect database”)
}
// 设置logger,输出SQL语句和执行时间
db.Callback().Query().Before(“gorm:query”).Register(“logger”, logger.Default.LogFunc())
// 执行查询
var users []User
db.Find(&users)
// 指定查询条件
db.Where(&User{Name: “jinzhu”}).Find(&users)
// 限制返回数量
db.Limit(10).Offset(5).Find(&users)
// 查询部分字段(即从select * 改造为 select name, age)
db.Select(“name”, “age”).Find(&users)
// 查询并按年龄降序、姓名升序排列
db.Order(“age desc, name”).Find(&users)
}

5.3 Viper:用于配置管理

Viper是一个完善的Go语言配置包,它的目的是处理各种格式的配置文件信息。Viper支持多种格式的配置文件,如json、toml、yaml、yml、properties、props、prop、hcl、tfvars、dotenv、env、ini等,同时也支持从文件、环境变量、命令行、io.Reader、远程配置中心(etcd、etcd3、consul、firestore)读取和修改配置。Viper可以监听配置文件修改,并应用到程序中。

Viper使用示例:

// 在main函数中设置配置文件路径和格式
viper.SetConfigType(“yaml”)
viper.SetConfigName(“config”)
viper.AddConfigPath(“/etc/app/config”)
viper.AddConfigPath(“./”)

// 读取配置文件内容到变量中
viper.Get(“server.host”) // 获取host的值
viper.Get(“server.port”) // 获取port的值

5.4 UUID:生成唯一标识符

UUID是Universally Unique Identifier的缩写,即通用唯一识别码。

UUID的目的是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。

在Go语言中,并没有UUID的标准库,所以需要借助第三方库来生成UUID,例如Go-UUID。

使用示例:

package main

import (
“fmt”
“math/rand”
“time”
“go-uuid”
)

func main() {
// 生成一个UUID
u1, err := go_uuid.NewV4()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(u1)
}

5.5 Golang-Boilerplate:快速创建项目模板

Golang-Boilerplate是一个用于生成Go语言基础代码的模板库。

Golang-Boilerplate可以帮助开发者快速生成重复的代码,提高开发效率

Golang-Boilerplate包含了一些常用的代码片段,如错误处理、日志记录、数据验证等。

使用Golang-Boilerplate可以减少重复编码,提高代码质量和可维护性

下面是一个使用Golang-Boilerplate的示例:

package main

import (
“fmt”
“net/http”

“golang-boilerplate/handler”
)

func main() {
handler := handler.New()
http.Handle(“/”, handler)
http.ListenAndServe(“:8080”, nil)
}

在这个示例中,我们使用了Golang-Boilerplate的handler包来创建一个HTTP处理器,然后通过http.Handle函数将根路径(“/”)映射到该处理器上,最后通过http.ListenAndServe函数启动了一个HTTP服务器。

5.6 Gomega and Gomega matchers:用于测试断言

Gomega是一个Go语言的测试库,它提供了一些用于编写单元测试和集成测试的断言和匹配器。Gomega匹配器是该库中的一部分,用于测试期望值是否与实际值匹配。

Gomega匹配器用于判断测试用例中的期望结果是否与实际结果相匹配,如果不匹配,则测试失败

Gomega匹配器可以用于测试各种类型的数据,包括基本数据类型、容器、错误、接口和自定义类型。使用Gomega匹配器可以简化测试用例的编写,提高测试的准确性和可读性。

下面是一些Gomega匹配器的使用示例:

  • ShouldEqual:用于比较两个值是否相等,相等则测试通过。

Expect(1).ShouldEqual(1)
Expect(“foo”).ShouldEqual(“foo”)

  • ShouldNotEqual:用于比较两个值是否不相等,不相等则测试通过。

Expect(1).ShouldNotEqual(2)
Expect(“foo”).ShouldNotEqual(“bar”)

  • ShouldResemble:用于比较两个值是否具有相同的结构,但不关心具体的值。

Expect([]int{1, 2, 3}).ShouldResemble([]int{1, 2, 3})
Expect([]string{“foo”, “bar”}).ShouldResemble([]string{“foo”, “bar”})

  • ShouldNotResemble:用于比较两个值是否不具有相同的结构。

Expect([]int{1, 2, 3}).ShouldNotResemble([]int{4, 5, 6})
Expect([]string{“foo”, “bar”}).ShouldNotResemble([]string{“baz”, “qux”})

以上只是Gomega匹配器的一部分,Gomega还提供了更多的匹配器,可以根据具体的需求选择合适的匹配器。

5.7 GoDoc:文档生成工具

GoDoc是Go语言的一个文档生成工具,它可以从Go源代码中自动生成API文档。

GoDoc可以生成以HTML形式呈现的文档,并支持多种样式和主题

GoDoc使用正则表达式来识别注释,注释在源代码中的位置和格式都会被记录下来,然后根据这些信息生成文档。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

712967256454)]
[外链图片转存中…(img-6cUfyEK9-1712967256456)]
[外链图片转存中…(img-cXUNKBnj-1712967256456)]
[外链图片转存中…(img-TjaUpZJt-1712967256457)]
[外链图片转存中…(img-RaQtH0Ey-1712967256457)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-TZJUm6Ly-1712967256458)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值