Go最全golang标准库和第三方框架超详细使用指南_golang使用第三方库(1),2024年最新阿里P8大牛亲自教你

img
img
img

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

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

如果你需要这些资料,可以戳这里获取

// 监听UDP端口
conn, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.ParseIP("localhost"), Port: 8080})
if err != nil {
    fmt.Println(err)
    return
}
defer conn.Close()

}



#####     4.3 time包:时间相关操作


`time`包是Go语言中处理时间(日期和时间)的库。


**time包主要函数有:Now、Unix、Tick、Format等**。


`time`包提供了`time.Time`类型,用于表示时间;`time.Now`函数,用于获取当前时间;`time.Unix`函数,用于将时间戳转为时间格式;`time.Tick`函数,用于设置定时器;以及`time.Format`方法,用于格式化时间等。


    以下是`go time`包的使用示例:



package main

import (
“fmt”
“time”
)

func timeDemo() {
now := time.Now() // 获取当前时间
fmt.Printf(“current time:%v\n”, now)
year := now.Year() // 年
month := now.Month() // 月
day := now.Day() // 日
hour := now.Hour() // 小时
minute := now.Minute() // 分钟
second := now.Second() // 秒
fmt.Println(year, month, day, hour, minute, second)
}

func main() {
timeDemo()
}


    运行以上代码,输出如下结果:



2023 July 5 15 26 17 736596440 +0800 CST m=+0.000139043```


#####      4.4 os包:操作系统接口


`go os`包提供了许多与操作系统交互的函数1。


    以下是`go os`包的部分函数及其功能1:


* `Hostname()`:返回内核提供的主机名。
* `Getpagesize()`:返回底层的系统内存页的尺寸。
* `Environ()`:返回表示环境变量的格式为"key=value"的字符串的切片拷贝。
* `Getenv(key string)`:检索并返回名为key的环境变量的值,如果不存在该环境变量会返回空字符串。
* `Setenv(key,value string)`:设置名为key的环境变量,如果出错会返回该错误。
* `Clearenv()`:删除所有环境变量。
* `Exit(code int)`:让当前程序以给出的状态码code退出,一般来说,状态码0表示成功,非0表示出错,程序会立刻终止,defer的函数不会被执行。


    以下是`go os`包的使用示例:



package main

import (
“fmt”
“os”
)

func main() {
fmt.Println(os.Hostname()) // 返回内核提供的主机名
fmt.Println(os.Getpagesize()) // 返回底层的系统内存页的尺寸
fmt.Println(os.Environ()) // 返回表示环境变量的格式为"key=value"的字符串的切片拷贝
fmt.Println(os.Getenv(“PATH”)) // 检索并返回名为"PATH"的环境变量的值
fmt.Println(os.Setenv(“PATH”,“test”)) // 设置名为"PATH"的环境变量
fmt.Println(os.Clearenv()) // 删除所有环境变量
fmt.Println(os.Exit(0)) // 让当前程序以状态码0退出
fmt.Println(os.Getuid()) // 返回调用者的用户ID
fmt.Println(os.Getgid()) // 返回调用者的组ID
fmt.Println(os.Getpid()) // 返回调用者所在进程的进程ID
fmt.Println(os.Getppid()) // 返回调用者所在进程的父进程的进程ID
}


#####     4.5 strings包:字符串处理


**strings包是Go语言标准库中提供的一个包,用于处理字符串相关的操作**。


    strings包中包含了许多函数,可以用于字符串的切割、拼接、替换、查找等操作。


    以下是strings包中一些常用的函数及用法示例1:


* `Index(str, substr string) int`:返回子字符串substr在字符串str中第一次出现的索引,如果未找到则返回-1。
* `Join(strSlice []string, sep string) string`:将字符串切片strSlice用sep连接成一个字符串。
* `Repeat(str string, count int) string`:将字符串str重复count次,返回一个新字符串。
* `Replace(str, old, new string, n int) string`:将字符串str中old替换为new,最多替换n次。
* `ToUpper(str string) string`:将字符串str转换为大写。
* `ToLower(str string) string`:将字符串str转换为小写。


    以下是`go strings`包的使用示例:



package main

import (
“fmt”
“strings”
)

func main() {
str := “Hello, World!”
fmt.Println(strings.Count(str, “o”)) // 输出:3
fmt.Println(strings.Index(str, “o”)) // 输出:4
fmt.Println(strings.IndexRune(str, ‘o’)) // 输出:4
fmt.Println(strings.Count(str, “l”)) // 输出:3
fmt.Println(strings.HasPrefix(“Hello”, “He”)) // 输出:true
fmt.Println(strings.HasSuffix(“Hello”, “lo”)) // 输出:true
fmt.Println(strings.Replace(str, “o”, "", -1)) // 输出:Hello, Wrld!
fmt.Println(strings.Fields(str)) // 输出:[“Hello”, “World!”]
fmt.Println(strings.SplitAfter(str, “o”)) // 输出:[Hello, World! o]
fmt.Println(strings.ToLower(str)) // 输出:hello, world!
fmt.Println(strings.ToUpper(str)) // 输出:HELLO, WORLD!
}



#####     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和ServeMux**1。


* 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”)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

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

s、dotenv、env、ini等,同时也支持从文件、环境变量、命令行、io.Reader、远程配置中心(etcd、etcd3、consul、firestore)读取和修改配置。Viper可以监听配置文件修改,并应用到程序中。

Viper使用示例:

// 在main函数中设置配置文件路径和格式
viper.SetConfigType("yaml")


[外链图片转存中...(img-ooLyG48R-1715813933811)]
[外链图片转存中...(img-Mv21NiYN-1715813933812)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


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

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值