GoFrame必知必会之Scan:类型转换

简介: Scan转换方法可以实现对任意参数到struct/struct数组/map/map数组的转换,并且根据开发者输入的转换目标参数自动识别执行转换。

Scan转换方法可以实现对任意参数到struct/struct数组/map/map数组的转换,并且根据开发者输入的转换目标参数自动识别执行转换。


方法定义


// Scan automatically calls MapToMap, MapToMaps, Struct or Structs function according to
// the type of parameter `pointer` to implement the converting.
// It calls function MapToMap if `pointer` is type of *map to do the converting.
// It calls function MapToMaps if `pointer` is type of *[]map/*[]*map to do the converting.
// It calls function Struct if `pointer` is type of *struct/**struct to do the converting.
// It calls function Structs if `pointer` is type of *[]struct/*[]*struct to do the converting.
func Scan(params interface{}, pointer interface{}, mapping ...map[string]string) (err error)


自动识别转换Struct结构体


示例代码


package main
import (
  "github.com/gogf/gf/frame/g"
  "github.com/gogf/gf/util/gconv"
)
func main() {
  type User struct {
    Uid  int
    Name string
  }
  params := g.Map{
    "uid":  1,
    "name": "王中阳",
  }
  var user *User
  if err := gconv.Scan(params, &user); err != nil {
    panic(err)
  }
  g.Dump(user)
}


运行结果

微信图片_20221112193943.jpg


自动识别转换Struct数组


示例代码


package main
import (
  "github.com/gogf/gf/frame/g"
  "github.com/gogf/gf/util/gconv"
)
func main() {
  type User struct {
    Uid  int
    Name string
  }
  params := g.Slice{
    g.Map{
      "uid":  1,
      "name": "优弧",
    },
    g.Map{
      "uid":  2,
      "name": "船长",
    },
  }
  var users []*User
  if err := gconv.Scan(params, &users); err != nil {
    panic(err)
  }
  g.Dump(users)
}


运行结果


微信图片_20221112193947.jpg


自动识别转换Map


示例代码


package main
import (
  "github.com/gogf/gf/frame/g"
  "github.com/gogf/gf/util/gconv"
)
func main() {
  var (
    user   map[string]string
    params = g.Map{
      "uid":  1,
      "name": "王中阳",
    }
  )
  if err := gconv.Scan(params, &user); err != nil {
    panic(err)
  }
  g.Dump(user)
}


运行结果


微信图片_20221112193950.jpg


自动识别转换Map数组


package main
import (
  "github.com/gogf/gf/frame/g"
  "github.com/gogf/gf/util/gconv"
)
func main() {
  var (
    users  []map[string]string
    params = g.Slice{
      g.Map{
        "uid":  1,
        "name": "优弧",
      },
      g.Map{
        "uid":  2,
        "name": "船长",
      },
    }
  )
  if err := gconv.Scan(params, &users); err != nil {
    panic(err)
  }
  g.Dump(users)
}
复制代码


运行结果


微信图片_20221112193953.jpg


总结


我们使用Go语言的开发过程中,json数据和结构体的转换是经常遇到的。

GoFrame为我们封装了Scan转换方法可以实现对任意参数到struct/struct数组/map/map数组的转换,并且根据开发者输入的转换目标参数自动识别执行转换。

相关文章
|
JavaScript 开发者 索引
搞懂 TypeScript 中的映射类型(Mapped Types)
搞懂 TypeScript 中的映射类型(Mapped Types)
759 0
|
1月前
|
Dart 安全 编译器
Flutter结合鸿蒙next 中数据类型转换的高级用法:dynamic 类型与其他类型的转换解析
在 Flutter 开发中,`dynamic` 类型提供了灵活性,但也带来了类型安全性问题。本文深入探讨 `dynamic` 类型及其与其他类型的转换,介绍如何使用 `as` 关键字、`is` 操作符和 `whereType<T>()` 方法进行类型转换,并提供最佳实践,包括避免过度使用 `dynamic`、使用 Null Safety 和异常处理,帮助开发者提高代码的可读性和可维护性。
81 1
|
7月前
|
编译器 C#
C#.Net筑基-类型系统②常见类型 --record是什么类型?
`record`在C#中是一种创建简单、只读数据结构的方式,常用于轻量级数据传输。它本质上是类(默认)或结构体的快捷形式,包含自动生成的属性、`Equals`、`ToString`、解构赋值等方法。记录类型可以继承其他record或接口,但不继承普通类。支持使用`with`语句创建副本。例如,`public record User(string Name, int Age)`会被编译为包含属性、相等比较和`ToString()`等方法的类。记录类型提供了解构赋值和自定义实现,如密封的`sealed`记录,防止子类重写。
|
API Kotlin
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
Kotlin中扩展函数、infix关键字、apply函数和DSL的详解
135 0
|
7月前
|
SQL Java 数据库
JPQL语言和Query接口简解
JPQL语言和Query接口简解
57 0
|
Go
Golang 语言极简类型转换库 cast
Golang 语言极简类型转换库 cast
64 0
|
SQL Java
java代码中如何实现sql中 in字段的单引号?
java代码中如何实现sql中 in字段的单引号?
170 0
|
存储 索引
ES中 Nested 类型的原理和使用
ES中 Nested 类型的原理和使用
|
开发框架 数据库
GoFrame代码优化:使用gconv类型转换 避免重复定义map
最近一直在研究 GoFrame 框架,经过一段时间的使用、总结、思考,发现确实不失为一款非常值得使用的企业级开发框架。
422 0
|
存储 NoSQL Go
GoFrame gredis 如何优雅的取值和类型转换
今天重点为大家介绍:GoFrame gredis 如何优雅的取值和类型转换
194 0