Golang笔记flipped-aurora/gin-vue-admin
本文环境 flipped-aurora/gin-vue-admin
不懂的可以评论或联系我邮箱:owen@owenzhang.com
著作权归OwenZhang所有。商业转载请联系OwenZhang获得授权,非商业转载请注明出处。
RESTful API 文章介绍
https://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html
Mysql
// 创建成功后返回ID
func (exa *TagService) CreateExaTagByID(e example.ExaTag) (err error, tagID uint) {
// 插入数据
err = global.GVA_DB.Create(&e).Error
if err != nil {
return err, 0
}
// 返回插入后的 tagID
return nil, e.ID
}
Redis
要开启use-redis: true才可以使用Redis
//打印 global.GVA_CONFIG.Redis 的配置,检查是否和手动创建的配置一致:
global.GVA_LOG.Info("Redis 客户端类型", zap.String("Type", fmt.Sprintf("%T", global.GVA_REDIS)))
global.GVA_LOG.Info("Redis 配置", zap.String("Addr", global.GVA_CONFIG.Redis.Addr), zap.String("Password", global.GVA_CONFIG.Redis.Password))
// 将 tagName 保存到 Redis 中,不能写入,报错
a = "标签12"
err = global.GVA_REDIS.Set(context.TODO(), "tagNameKey", a, 3600*time.Second).Err()
if err != nil {
// 添加更多上下文信息到日志
global.GVA_LOG.Error("Redis 写入失败", zap.String("tagName", a), zap.Error(err))
response.FailWithMessage("Redis 写入失败", c)
return
}
//创建一个新的 Redis 客户端实例,可以正常写入
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis 服务地址
Password: "", // Redis 密码,如果没有设置密码,可以留空
DB: 0, // 使用的数据库,默认是 DB 0
})
// 将 tagName 存储到 Redis 中
err = client.Set(context.Background(), "tagNameKey", a, 3600*time.Second).Err()
if err != nil {
// Redis 写入失败,记录日志并返回错误信息
global.GVA_LOG.Error("Redis 写入失败", zap.String("tagName", a), zap.Error(err))
response.FailWithMessage("Redis 写入失败", c)
return
}
response.FailWithMessage("tag test GetExaTag", c)
return
POST
// 获取 tagName 参数并将其赋值给变量 a
a := tag.TagName
// 检查 tagName 是否为空
if a == "" {
global.GVA_LOG.Error("tagName is empty", zap.String("tagName", a))
response.FailWithMessage("tagName is empty", c)
return
}
// 重新post的参数tagName赋值为 222
tag.TagName = "222"
//或者
// 获取表单数据中的 tagName 参数
tagName := c.PostForm("tagName")
// 如果 tagName 为空,返回空响应
if tagName == "" {
fmt.Println("tagName is empty")
c.JSON(http.StatusOK, gin.H{"tagName": ""})
return
}
// 打印 tagName
fmt.Println("Received tagName:", tagName) // 这里打印 tagName
// 返回成功响应
c.JSON(http.StatusOK, gin.H{
"message": "success",
"tagName": tagName,
})
HTTP GET/POST请求别人接口
func (e *TagApi) httpGet(c *gin.Context) {
// 发起 GET 请求
getURL := "https://ip.cn/api/index?ip=&type=0"
resp, err := http.Get(getURL)
if err != nil {
fmt.Println("GET request error:", err)
return
}
defer resp.Body.Close()
// 读取 GET 请求的响应
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Read GET response error:", err)
return
}
//GET Response: {"rs":1,"code":0,"address":"美国 加利福尼亚 旧金山 ","ip":"172.70.90.122","isDomain":0}
fmt.Println("GET Response:", string(body))
// 将 JSON 数据解析为 map 类型
var data map[string]interface{}
if err := json.Unmarshal(body, &data); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "JSON unmarshal failed"})
return
}
//{
// "code": 0,
// "data": {
// "address": "美国 加利福尼亚 旧金山 ",
// "code": 0,
// "ip": "172.70.85.97",
// "isDomain": 0,
// "rs": 1
// },
// "msg": "获取成功"
//}
response.OkWithDetailed(data, "获取成功", c)
//response.FailWithMessage("创建失败1", c)
}
func (e *TagApi) httpPost(c *gin.Context) {
// 设置目标 API URL
postURL := "https://api.juejin.cn/interact_api/v2/comment/list?aid=2608&uuid=7431027474634638886&spider=0"
// 创建 POST 请求的数据(例如:发送 JSON 数据)
requestData := map[string]interface{}{
"item_id": "7202153645440925751",
"item_type": 2,
"limit": 3,
}
// 将请求数据编码为 JSON
jsonData, err := json.Marshal(requestData)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to encode JSON"})
return
}
// 发起 POST 请求
resp, err := http.Post(postURL, "application/json", bytes.NewBuffer(jsonData))
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "POST request failed"})
return
}
defer resp.Body.Close()
// 读取响应体
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to read response"})
return
}
// 将响应的 JSON 数据打印出来
fmt.Println("POST Response:", string(body))
// 将 JSON 数据解析为 map 类型
var data map[string]interface{}
if err := json.Unmarshal(body, &data); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "JSON unmarshal failed"})
return
}
response.OkWithDetailed(data, "获取成功", c)
}
获取数据中某值data.comments[1].user_info.user_id
package main
import (
"encoding/json"
"fmt"
)
func main() {
// 假设 JSON 数据如下
jsonData := `{
"data": {
"count": 455,
"has_more": true,
"sort": 1,
"comments": [
{
"comment_id": "7214670740640564029",
"is_author": false,
"user_info": {
"account_amount": 0,
"annual_info": [],
"user_id": "2643639612747277"
}
},
{
"comment_id": "7214670740640564029",
"is_author": false,
"user_info": {
"account_amount": 0,
"annual_info": [],
"user_id": "2643639612747278"
}
}
]
}
}`
// 定义一个结构体来接收数据
var result map[string]interface{}
// 解析 JSON 数据
if err := json.Unmarshal([]byte(jsonData), &result); err != nil {
fmt.Println("Error parsing JSON:", err)
return
}
// 获取 comments 数组
comments := result["data"].(map[string]interface{})["comments"].([]interface{})
// 获取第二个 comment 中的 user_id
if len(comments) > 1 {
// 获取第二个 comment 中的 user_info -> user_id
userID := comments[1].(map[string]interface{})["user_info"].(map[string]interface{})["user_id"].(string)
fmt.Println("Second comment's user_id:", userID)
} else {
fmt.Println("No second comment found.")
}
}
Other
// 打印POST请求的tagName参数
fmt.Println("Received tagName:", tag.TagName)
fmt.Println(1)
//终端程序
os.Exit(0)
//接口返回json
response.FailWithMessage("tag test GetExaTag", c)
return
数据类型
package main
import "fmt"
func main() {
// 1. 布尔类型
var b bool = true
fmt.Println("Boolean:", b) // 输出: Boolean: true
// 2. 数字类型
// 整型
var i int = 42
fmt.Println("Integer:", i) // 输出: Integer: 42
// 无符号整型
var u uint = 99
fmt.Println("Unsigned Integer:", u) // 输出: Unsigned Integer: 99
// 浮点型
var f float64 = 3.14
fmt.Println("Float:", f) // 输出: Float: 3.14
// 复数类型
var c complex128 = 1 + 2i
fmt.Println("Complex:", c) // 输出: Complex: (1+2i)
// 3. 字符类型 (rune)
var r rune = 'A'
fmt.Println("Rune (Character):", r) // 输出: Rune (Character): 65
// 4. 字节类型 (byte)
var b1 byte = 'B'
fmt.Println("Byte:", b1) // 输出: Byte: 66
// 5. 数组类型
var arr [3]int = [3]int{1, 2, 3}
fmt.Println("Array:", arr) // 输出: Array: [1 2 3]
// 6. 切片类型
var slice []int = []int{4, 5, 6}
fmt.Println("Slice:", slice) // 输出: Slice: [4 5 6]
// 7. 映射类型
var m map[string]int = map[string]int{"a": 1, "b": 2}
fmt.Println("Map:", m) // 输出: Map: map[a:1 b:2]
// 8. 结构体类型
type Person struct {
Name string
Age int
}
var p Person = Person{Name: "Alice", Age: 30}
fmt.Println("Struct:", p) // 输出: Struct: {Alice 30}
// 9. 接口类型
var i1 interface{} = "Hello"
fmt.Println("Interface:", i1) // 输出: Interface: Hello
// 10. 指针类型
var ptr *int = &i
fmt.Println("Pointer:", ptr) // 输出: Pointer: 0xc0000180a0
// 11. 函数类型
var add func(int, int) int = func(x, y int) int {
return x + y
}
fmt.Println("Function result:", add(1, 2)) // 输出: Function result: 3
// 12. 常量类型
const pi float64 = 3.14159
fmt.Println("Constant:", pi) // 输出: Constant: 3.14159
}
Buy me a cup of coffee 🙂
觉得对你有帮助,就给我打赏吧,谢谢!