Go语言中,结构体和JSON互转
结构体转JSON package main
import (
"encoding/json"
"fmt"
)
type Zhihu struct {
Article string
Goods int
}
func main() {
z := Zhihu{
Article: "Go语言结构体和JSON相互转换",
Goods: 100,
}
output, _ := json.Marshal(&z)
fmt.Println(string(output))
}
JSON转结构体
package main
import (
"encoding/json"
"fmt"
)
type Zhihu struct {
Article string
Goods ...
gorm更新字段内容是0值,不更新解决方法
当通过 struct 更新时,GORM 只会更新非零字段。 如果您想确保指定字段被更新,你应该使用 Select 更新选定字段,或使用 map 来完成更新操作
// 根据 `struct` 更新属性,只会更新非零值的字段
db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;
// 根据 `map` 更新属性
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "active": false})
// UPDATE ...
Go结构体转map
func StructToMap(stc interface{}) map[string]interface{} {
newMap := make(map[string]interface{})
t := reflect.TypeOf(stc)
v := reflect.ValueOf(stc)
fields := t.NumField()
for i := 0; i < fields; i++ {
key := t.Field(i).Name
// 解析注解key
if t.Field(i).Tag.Get("json") != "" {
key = t.Field(i).Tag.Get("json")
}
// 解析结构体类型
if v.Field(i).Kin ...
Golang interface{} 转 string
断言
func GetInterfaceToString(value interface{}) string {
// interface 转 string
var key string
if value == nil {
return key
}
switch value.(type) {
case float64:
ft := value.(float64)
key = strconv.FormatFloat(ft, 'f', -1, 64)
case float32:
ft := value.(float32)
key = strconv.FormatFloat(float64(ft), 'f', -1, 64)
case int:
it := value.(int)
key = strconv.Itoa(i ...
Gorm 分页 Offset ,Limit
db.Model(&Table{}).Count(&count) //总条数
db.Model(&Table{}).Offset(pstart).Limit(psize).Find(&Table{}) //获取每页数据
db.Model(&Table{}).Offset(-1).Limit(psize).Find(&Table{}).Count(&count) //获取第一页数据,并返回全部条数
GORM 分页封装
//分页封装
func Paginate(page int,pageSize int) func(db *gorm.DB) *gorm.DB {
return func (db *gorm.DB) *gorm.DB {
if page == 0 {
page = 1
}
switch {
case pageSize > 500:
pageSize = 500
case pageSize <= 0:
pageSize = 10
}
offset := (page - 1) * pageSize
return db.Offset(offset).Limit(pageSize)
}
}
使用gorm的Scopes调用写好的分页查询方法传入参数即可 Scopes 使你可以复用通 ...
GO 字符串分割与拼接
分割//根据空格分割
strings.Fields(s string) []string
//根据自定义字符分割
strings.Split(s string,sep string) []string
// 返回值是 []string,使用 for 遍历
for i := 0; i < len([]string); i++ {
fmt.Println([]string[i])
}
//自定义分割func
strings.FieldsFunc(s string,f func(rune) bool) []string
s:要分割的字符串
f:自定义的分割规则函数,返回类型为bool类型
返回结果为[]string
例:
f := func(c rune) bool {
if c == '*' || c == '@'||c=='f'||c==' '||c=='二' {
return true
} else {
retu ...
GORM 事务
禁用默认事务
为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这将获得大约 30%+ 性能提升。
// 全局禁用
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
SkipDefaultTransaction: true,
})
// 持续会话模式
tx := db.Session(&Session{SkipDefaultTransaction: true})
tx.First(&user, 1)
tx.Find(&users)
tx.Model(&user).Update("Age", 18)
事务
要在事务中执行一系列操作,一般流程如下:
db.Transaction(func(tx *gorm.DB) error {
// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' ...
宝塔升级后无法启动解决方法
错误提示
Error: BT-Task service startup failed.
解决方式
1.rm -rf /www/server/panel/pyenv
2.curl https://download.bt.cn/install/update_panel.sh|bash
Golang 时间转换
package main
import (
"fmt"
"time"
)
func main() {
timeLayout := "2006-01-02 15:04:05"
timeStamp, _ := time.ParseInLocation(timeLayout, "2021-11-20 23:34:10", time.Local)
fmt.Println(timeStamp)
}
package main
import (
"fmt"
"time"
)
func main() {
timeLayout := "2006-01-02 15:04:05"
timeStr := time.Unix(1637420154, 0).Format(timeLayout)
fmt.Println(timeStr)
}