Compare commits
2 Commits
2d4974ebcf
...
048fd75b0c
Author | SHA1 | Date | |
---|---|---|---|
048fd75b0c | |||
a2b55d3567 |
@ -18,6 +18,7 @@ func main() { // 主函数(程序入口)
|
||||
c := 30 // 短声明(函数内使用)
|
||||
var d, e int = 1, 2 // 多变量声明
|
||||
```
|
||||
|
||||
|
||||
- **常量**
|
||||
```go
|
||||
@ -128,7 +129,7 @@ func main() { // 主函数(程序入口)
|
||||
```
|
||||
- 特点:
|
||||
- Go 的指针**不支持算术运算**,避免了内存越界和非法访问的风险,同时通过垃圾回收机制自动管理内存,**减少了内存泄漏的可能性**。
|
||||
- Go 的指针类型严格区分,空指针用 `nil` 表示,解引用空指针会触发 panic,不支持**指针算术运算和强制类型转换**。
|
||||
- Go 的指针类型严格区分,空指针用 `nil` 表示,解引用空指针会触发 **panic**,不支持**指针算术运算和强制类型转换**。
|
||||
- **结构体与方法**
|
||||
```go
|
||||
type Circle struct {
|
||||
@ -247,14 +248,6 @@ func main() { // 主函数(程序入口)
|
||||
}
|
||||
```
|
||||
|
||||
- **JSON 处理**
|
||||
```go
|
||||
type User struct {
|
||||
Name string `json:"name"`
|
||||
Age int `json:"age"`
|
||||
}
|
||||
data, _ := json.Marshal(user) //序列化
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
@ -38,6 +38,10 @@ func divide(a, b float64) (float64, error) {
|
||||
return a / b, nil
|
||||
}
|
||||
|
||||
func PrintHalloworld() {
|
||||
fmt.Println("Hello, World!")
|
||||
}
|
||||
|
||||
// 主函数
|
||||
func main() {
|
||||
// 变量声明
|
||||
@ -51,7 +55,6 @@ func main() {
|
||||
slice := []int{4, 5, 6}
|
||||
slice = append(slice, 7)
|
||||
fmt.Println("Array:", arr, "Slice:", slice)
|
||||
|
||||
// 映射
|
||||
m := map[string]int{"one": 1, "two": 2}
|
||||
fmt.Println("Map:", m)
|
||||
@ -106,6 +109,7 @@ func main() {
|
||||
|
||||
// 并发
|
||||
var wg sync.WaitGroup
|
||||
go PrintHalloworld()
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
@ -134,6 +138,7 @@ func main() {
|
||||
}()
|
||||
select {
|
||||
case msg := <-ch1:
|
||||
go PrintHalloworld()
|
||||
fmt.Println("Select:", msg)
|
||||
case msg := <-ch2:
|
||||
fmt.Println("Select:", msg)
|
||||
@ -145,3 +150,9 @@ func main() {
|
||||
defer fmt.Println("Defer: This runs last")
|
||||
fmt.Println("Main function end")
|
||||
}
|
||||
|
||||
func add(a, b int) (x, y int) {
|
||||
x = a + b
|
||||
y = a - b
|
||||
return
|
||||
}
|
||||
|
@ -100,14 +100,17 @@ if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
- update方式
|
||||
```go
|
||||
// 更新单个字段
|
||||
var user User
|
||||
user.name="Alice"
|
||||
db.Model(&user).Update("Age", 30)
|
||||
// 更新多个字段(零值需使用map)
|
||||
db.Model(&user).Updates(map[string]interface{}{"Age": 30, "Name": ""})
|
||||
// 使用结构体更新(忽略零值)
|
||||
// 使用结构体更新(******忽略零值******)
|
||||
db.Model(&user).Updates(User{Name: "Alice", Age: 0}) // Age不会被更新
|
||||
```
|
||||
- save方式
|
||||
```
|
||||
```go
|
||||
db.First(&user,1)
|
||||
db.Save(&user) //更新所有字段
|
||||
db.Save(&user).Omit("Name") //更新除Name字段外的所有字段
|
||||
```
|
||||
|
@ -104,6 +104,7 @@ func main() {
|
||||
// 定义 User 模型
|
||||
type User struct {
|
||||
gorm.Model
|
||||
Name string
|
||||
Age int
|
||||
Name string `gorm:"index"`
|
||||
Age int `gorm:"index"`
|
||||
// Point int `gorm:"index"` // 创建索引
|
||||
}
|
||||
|
@ -6,4 +6,5 @@ host = "localhost"
|
||||
port = 3306
|
||||
user = "yzk_study"
|
||||
password = "yzk722923"
|
||||
dbname="Class"
|
||||
dbname="Class"
|
||||
|
||||
|
@ -15,6 +15,7 @@ TOML(Tom's Obvious, Minimal Language)是一种配置文件格式,旨在易
|
||||
multi_line_string = """
|
||||
This is a
|
||||
multi-line string.
|
||||
nihao
|
||||
"""
|
||||
```
|
||||
|
||||
|
10
Go入门速成/Day3/ExampleCode/Redis/go.mod
Normal file
10
Go入门速成/Day3/ExampleCode/Redis/go.mod
Normal file
@ -0,0 +1,10 @@
|
||||
module Redis
|
||||
|
||||
go 1.24.1
|
||||
|
||||
require github.com/go-redis/redis v6.15.9+incompatible
|
||||
|
||||
require (
|
||||
github.com/onsi/ginkgo v1.16.5 // indirect
|
||||
github.com/onsi/gomega v1.36.2 // indirect
|
||||
)
|
87
Go入门速成/Day3/ExampleCode/Redis/go.sum
Normal file
87
Go入门速成/Day3/ExampleCode/Redis/go.sum
Normal file
@ -0,0 +1,87 @@
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg=
|
||||
github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
|
||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
|
||||
github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
|
||||
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
73
Go入门速成/Day3/ExampleCode/Redis/main.go
Normal file
73
Go入门速成/Day3/ExampleCode/Redis/main.go
Normal file
@ -0,0 +1,73 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/go-redis/redis"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 创建Redis客户端
|
||||
client := redis.NewClient(&redis.Options{
|
||||
Addr: "localhost:6379", // Redis服务器地址
|
||||
Password: "", // Redis服务器密码
|
||||
DB: 0, // Redis数据库索引
|
||||
})
|
||||
|
||||
pong, err := client.Ping().Result()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
println(pong)
|
||||
// 设置键值对
|
||||
err = client.Set("yzk_study@163.com", "123456", 600*time.Second).Err()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
// 获取键值对
|
||||
val, err := client.Get("yzk_study@163.com").Result()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
println(val)
|
||||
// 删除键值对
|
||||
err = client.Del("yzk_study@163.com").Err()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
// 设置哈希字段
|
||||
client.HMSet("user:1", map[string]interface{}{"name": "Bob", "age": 30})
|
||||
|
||||
// 获取哈希字段
|
||||
age, err := client.HGet("user:1", "age").Int()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println("User age:", age) // 输出: User age: 30
|
||||
// 向列表尾部添加元素
|
||||
client.RPush("tasks", "task1", "task2")
|
||||
// 获取列表范围
|
||||
tasks, err := client.LRange("tasks", 0, -1).Result()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println("Tasks:", tasks) // 输出: Tasks: [task1 task2]
|
||||
|
||||
// 添加元素到集合
|
||||
client.SAdd("tags", "golang", "redis")
|
||||
// 检查元素是否存在
|
||||
var exists bool
|
||||
exists, err = client.SIsMember("tags", "golang").Result()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
//取出集合中的所有元素
|
||||
tags, err := client.SMembers("tags").Result()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println("Tags:", tags) // 输出: Tags: [golang redis]
|
||||
|
||||
fmt.Println("Exists golang:", exists) // 输出: true
|
||||
}
|
1
Go入门速成/Day3/ExampleCode/gin/Halloworld.txt
Normal file
1
Go入门速成/Day3/ExampleCode/gin/Halloworld.txt
Normal file
@ -0,0 +1 @@
|
||||
Halloworld
|
34
Go入门速成/Day3/ExampleCode/gin/go.mod
Normal file
34
Go入门速成/Day3/ExampleCode/gin/go.mod
Normal file
@ -0,0 +1,34 @@
|
||||
module gin
|
||||
|
||||
go 1.24.1
|
||||
|
||||
require github.com/gin-gonic/gin v1.10.0
|
||||
|
||||
require (
|
||||
github.com/bytedance/sonic v1.11.6 // indirect
|
||||
github.com/bytedance/sonic/loader v0.1.1 // indirect
|
||||
github.com/cloudwego/base64x v0.1.4 // indirect
|
||||
github.com/cloudwego/iasm v0.2.0 // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
|
||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||
github.com/go-playground/locales v0.14.1 // indirect
|
||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||
github.com/go-playground/validator/v10 v10.20.0 // indirect
|
||||
github.com/goccy/go-json v0.10.2 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
|
||||
github.com/leodido/go-urn v1.4.0 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||
github.com/ugorji/go/codec v1.2.12 // indirect
|
||||
golang.org/x/arch v0.8.0 // indirect
|
||||
golang.org/x/crypto v0.23.0 // indirect
|
||||
golang.org/x/net v0.25.0 // indirect
|
||||
golang.org/x/sys v0.20.0 // indirect
|
||||
golang.org/x/text v0.15.0 // indirect
|
||||
google.golang.org/protobuf v1.34.1 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
89
Go入门速成/Day3/ExampleCode/gin/go.sum
Normal file
89
Go入门速成/Day3/ExampleCode/gin/go.sum
Normal file
@ -0,0 +1,89 @@
|
||||
github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0=
|
||||
github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4=
|
||||
github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
|
||||
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
|
||||
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
|
||||
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
|
||||
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
|
||||
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
|
||||
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
|
||||
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
|
||||
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
|
||||
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
||||
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
|
||||
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
|
||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||
github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8=
|
||||
github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
|
||||
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
|
||||
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
|
||||
github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
|
||||
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
|
||||
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
|
||||
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
||||
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
|
||||
golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
|
||||
golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
|
||||
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
|
||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
|
||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
|
||||
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
|
||||
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
|
||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
9
Go入门速成/Day3/ExampleCode/gin/index.html
Normal file
9
Go入门速成/Day3/ExampleCode/gin/index.html
Normal file
@ -0,0 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>{{.title}}</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Welcome to {{.title}}</h1>
|
||||
</body>
|
||||
</html>
|
26
Go入门速成/Day3/ExampleCode/gin/main.go
Normal file
26
Go入门速成/Day3/ExampleCode/gin/main.go
Normal file
@ -0,0 +1,26 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func main() {
|
||||
r := gin.Default()
|
||||
r.LoadHTMLFiles("index.html")
|
||||
r.GET("/ping", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
"message": "pong",
|
||||
})
|
||||
})
|
||||
r.GET("/html", func(c *gin.Context) {
|
||||
c.HTML(200, "index.html", gin.H{
|
||||
"title": "Main website",
|
||||
})
|
||||
})
|
||||
r.GET("/getfiles", getfiles)
|
||||
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
|
||||
}
|
||||
|
||||
func getfiles(c *gin.Context) {
|
||||
c.File("./Halloworld.txt")
|
||||
}
|
227
Go入门速成/Day3/Gin的使用.md
Normal file
227
Go入门速成/Day3/Gin的使用.md
Normal file
@ -0,0 +1,227 @@
|
||||
# Gin的使用
|
||||
## Gin是什么
|
||||
- Gin 是一个用 Go 语言编写的高性能 Web 框架,以其快速的路由和中间件支持著称。它基于 `httprouter`,提供了简洁的 API 和强大的功能,适合构建高效的 Web 应用和 API。
|
||||
|
||||
## 如何使用Gin
|
||||
### 创建一个最基本的Gin程序
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 创建默认 Gin 实例
|
||||
r := gin.Default()
|
||||
|
||||
// 定义路由和处理函数
|
||||
r.GET("/", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
"message": "Hello, Gin!",
|
||||
})
|
||||
})
|
||||
// 启动服务器,默认监听 8080 端口
|
||||
r.Run()
|
||||
}
|
||||
```
|
||||
- 修改启动端口`r.Run("80")`
|
||||
### Gin的使用方式
|
||||
- Gin 支持多种 HTTP 方法的路由定义:
|
||||
- `GET`
|
||||
- `POST`
|
||||
- `PUT`
|
||||
- `DELETE`
|
||||
- `PATCH`
|
||||
- `OPTIONS`
|
||||
- `HEAD`
|
||||
```go
|
||||
r.GET("/get", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
"message": "GET request",
|
||||
})
|
||||
})
|
||||
|
||||
r.POST("/post", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
"message": "POST request",
|
||||
})
|
||||
})
|
||||
```
|
||||
- Gin获取请求参数
|
||||
- - **查询参数**:`c.Query("key")`
|
||||
- **表单参数**:`c.PostForm("key")`
|
||||
- **路径参数**:`c.Param("key")`
|
||||
```go
|
||||
r.GET("/user", func(c *gin.Context) {
|
||||
name := c.Query("name")
|
||||
c.JSON(200, gin.H{
|
||||
"name": name,
|
||||
})
|
||||
})
|
||||
|
||||
r.POST("/user", func(c *gin.Context) {
|
||||
name := c.PostForm("name")
|
||||
c.JSON(200, gin.H{
|
||||
"name": name,
|
||||
})
|
||||
})
|
||||
|
||||
r.GET("/user/:id", func(c *gin.Context) {
|
||||
id := c.Param("id")
|
||||
c.JSON(200, gin.H{
|
||||
"id": id,
|
||||
})
|
||||
})
|
||||
```
|
||||
- Json参数
|
||||
```go
|
||||
var orders struct {
|
||||
DeviceId string `json:"deviceId"`
|
||||
Isrunning int `json:"isrunning"`
|
||||
}
|
||||
if err := c.ShouldBind(&orders); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
```
|
||||
- 分组路由
|
||||
|
||||
使用 `r.Group()` 创建路由分组:
|
||||
```go
|
||||
v1 := r.Group("/")
|
||||
{
|
||||
v1.GET("/login", func(c *gin.Context) {
|
||||
c.String(200, "v1 login")
|
||||
})
|
||||
v1.GET("/submit", func(c *gin.Context) {
|
||||
c.String(200, "v1 submit")
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
- Gin使用中间件
|
||||
```go
|
||||
func Logger() gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
fmt.Println("Request received")
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
r := gin.Default()
|
||||
r.Use(Logger())
|
||||
|
||||
r.GET("/", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
"message": "Hello, Gin!",
|
||||
})
|
||||
})
|
||||
|
||||
r.Run()
|
||||
}
|
||||
```
|
||||
- 返回多种响应
|
||||
- **JSON**:`c.JSON(code, obj)`
|
||||
- **字符串**:`c.String(code, format, values...)`
|
||||
- **HTML**:`c.HTML(code, name, obj)`
|
||||
- **文件**:`c.File(filepath)`
|
||||
```go
|
||||
r.GET("/json", func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{
|
||||
"message": "JSON response",
|
||||
})
|
||||
})
|
||||
|
||||
r.GET("/string", func(c *gin.Context) {
|
||||
c.String(200, "String response")
|
||||
})
|
||||
|
||||
r.GET("/html", func(c *gin.Context) {
|
||||
c.HTML(200, "index.html", gin.H{
|
||||
"title": "Main website",
|
||||
})
|
||||
})
|
||||
r.GET("/getfiles", getfiles)
|
||||
func getfiles(c *gin.Context) {
|
||||
c.File("./Halloworld.txt")
|
||||
}
|
||||
```
|
||||
### 常用的中间件
|
||||
#### 1. **CORS 跨域中间件**
|
||||
• **作用**:处理跨域请求,允许前端应用访问 API。
|
||||
• **包地址**:`github.com/gin-contrib/cors`
|
||||
• **安装**:
|
||||
```bash
|
||||
go get github.com/gin-contrib/cors
|
||||
```
|
||||
• **示例**:
|
||||
```go
|
||||
import "github.com/gin-contrib/cors"
|
||||
|
||||
r.Use(cors.New(cors.Config{
|
||||
AllowOrigins: []string{"https://example.com"},
|
||||
AllowMethods: []string{"GET", "POST"},
|
||||
AllowHeaders: []string{"Authorization"},
|
||||
}))
|
||||
```
|
||||
|
||||
#### 2. **JWT 身份验证中间件**
|
||||
• **作用**:验证请求的 Token,保护需要登录的接口。
|
||||
• **包地址**:`github.com/appleboy/gin-jwt/v2`
|
||||
• **安装**:
|
||||
```bash
|
||||
go get github.com/appleboy/gin-jwt/v2
|
||||
```
|
||||
• **示例**:
|
||||
```go
|
||||
authMiddleware, _ := jwt.New(&jwt.GinJWTMiddleware{
|
||||
Realm: "my-app",
|
||||
Key: []byte("secret-key"),
|
||||
Timeout: time.Hour,
|
||||
})
|
||||
r.POST("/login", authMiddleware.LoginHandler)
|
||||
r.GET("/protected", authMiddleware.MiddlewareFunc(), func(c *gin.Context) {
|
||||
c.JSON(200, gin.H{"msg": "Authorized"})
|
||||
})
|
||||
```
|
||||
|
||||
#### 3. **限流中间件(Rate Limiter)**
|
||||
• **作用**:防止接口被频繁调用(如防止暴力破解)。
|
||||
• **包地址**:`github.com/ulule/limiter/v3` + `github.com/ulule/limiter/v3/drivers/middleware/gin`
|
||||
• **安装**:
|
||||
```bash
|
||||
go get github.com/ulule/limiter/v3
|
||||
```
|
||||
• **示例**:
|
||||
```go
|
||||
import (
|
||||
"github.com/ulule/limiter/v3"
|
||||
"github.com/ulule/limiter/v3/drivers/middleware/gin"
|
||||
"github.com/ulule/limiter/v3/drivers/store/memory"
|
||||
)
|
||||
|
||||
rate := limiter.Rate{
|
||||
Period: 1 * time.Minute,
|
||||
Limit: 100, // 每分钟最多 100 次请求
|
||||
}
|
||||
store := memory.NewStore()
|
||||
limiterMiddleware := gin.NewMiddleware(limiter.New(store, rate))
|
||||
r.Use(limiterMiddleware)
|
||||
```
|
||||
|
||||
#### 4. **GZIP 压缩中间件**
|
||||
• **作用**:压缩 HTTP 响应体,减少传输体积。
|
||||
• **包地址**:`github.com/gin-contrib/gzip`
|
||||
• **安装**:
|
||||
```bash
|
||||
go get github.com/gin-contrib/gzip
|
||||
```
|
||||
• **示例**:
|
||||
```go
|
||||
import "github.com/gin-contrib/gzip"
|
||||
|
||||
r.Use(gzip.Gzip(gzip.DefaultCompression))
|
||||
```
|
||||
|
115
Go入门速成/Day3/Redis简单入门.md
Normal file
115
Go入门速成/Day3/Redis简单入门.md
Normal file
@ -0,0 +1,115 @@
|
||||
### 1. 安装 Redis 客户端库
|
||||
```bash
|
||||
go get github.com/go-redis/redis/v8
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. 连接 Redis
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/go-redis/redis/v8"
|
||||
)
|
||||
|
||||
var ctx = context.Background()
|
||||
|
||||
func main() {
|
||||
// 创建 Redis 客户端
|
||||
rdb := redis.NewClient(&redis.Options{
|
||||
Addr: "localhost:6379", // Redis 地址
|
||||
Password: "", // 密码(没有则为空)
|
||||
DB: 0, // 默认数据库
|
||||
})
|
||||
|
||||
// 检查连接
|
||||
pong, err := rdb.Ping(ctx).Result()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println("Connected to Redis:", pong)
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. 基本操作
|
||||
|
||||
#### 设置键值对
|
||||
```go
|
||||
// 设置键为 "name",值为 "Alice"
|
||||
err := rdb.Set(ctx, "yzk_study@163.com", "123456", 600).Err()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
```
|
||||
|
||||
#### 获取值
|
||||
```go
|
||||
val, err := rdb.Get(ctx, "yzk_study@163.com").Result()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println("His Verification code", val) // 输出: name: Alice
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. 数据结构操作
|
||||
|
||||
#### 哈希(Hashes)
|
||||
```go
|
||||
client.HMSet("user:1", map[string]interface{}{"name": "Bob", "age": 30})
|
||||
// 获取哈希字段
|
||||
age, err := client.HGet("user:1", "age").Int()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println("User age:", age) // 输出: User age: 30
|
||||
```
|
||||
|
||||
#### 列表(Lists)
|
||||
```go
|
||||
// 向列表尾部添加元素
|
||||
rdb.RPush(ctx, "tasks", "task1", "task2")
|
||||
|
||||
// 获取列表范围
|
||||
tasks, err := rdb.LRange(ctx, "tasks", 0, -1).Result()
|
||||
fmt.Println("Tasks:", tasks) // 输出: Tasks: [task1 task2]
|
||||
```
|
||||
|
||||
#### 集合(Sets)
|
||||
```go
|
||||
// 添加元素到集合
|
||||
client.SAdd("tags", "golang", "redis")
|
||||
// 检查元素是否存在
|
||||
var exists bool
|
||||
exists, err = client.SIsMember("tags", "golang").Result()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. 设置过期时间
|
||||
```go
|
||||
// 设置键值对,10秒后过期
|
||||
rdb.Set("temp_key", "expiring soon", 10*time.Second)
|
||||
|
||||
// 单独设置过期时间
|
||||
rdb.Expire("temp_key", 10*time.Second)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. 删除键
|
||||
```go
|
||||
rdb.Del("name")
|
||||
```
|
||||
|
||||
|
||||
更详细文档参考:[go-redis 官方文档](https://redis.uptrace.dev/)
|
Loading…
x
Reference in New Issue
Block a user