mirror of
https://gitee.com/johng/gf.git
synced 2024-11-29 10:47:38 +08:00
improve converter feature for package gconv (#3211)
This commit is contained in:
parent
383937fe69
commit
ba39323d30
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package boot
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,12 +1,19 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package boot
|
||||
|
||||
import (
|
||||
consul "github.com/gogf/gf/contrib/config/consul/v2"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gctx"
|
||||
"github.com/hashicorp/consul/api"
|
||||
"github.com/hashicorp/go-cleanhttp"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gctx"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package boot
|
||||
|
||||
import (
|
||||
|
@ -1,10 +1,17 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package boot
|
||||
|
||||
import (
|
||||
"k8s.io/client-go/kubernetes"
|
||||
|
||||
"github.com/gogf/gf/contrib/config/kubecm/v2"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gctx"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,11 +1,18 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package boot
|
||||
|
||||
import (
|
||||
"github.com/nacos-group/nacos-sdk-go/common/constant"
|
||||
"github.com/nacos-group/nacos-sdk-go/vo"
|
||||
|
||||
"github.com/gogf/gf/contrib/config/nacos/v2"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gctx"
|
||||
"github.com/nacos-group/nacos-sdk-go/common/constant"
|
||||
"github.com/nacos-group/nacos-sdk-go/vo"
|
||||
)
|
||||
|
||||
func init() {
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package nacos
|
||||
|
||||
import (
|
||||
|
58
example/converter/alias_type_convert_with_refer/main.go
Normal file
58
example/converter/alias_type_convert_with_refer/main.go
Normal file
@ -0,0 +1,58 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
type MyTime = *gtime.Time
|
||||
|
||||
type Src struct {
|
||||
A MyTime
|
||||
}
|
||||
|
||||
type Dst struct {
|
||||
B string
|
||||
}
|
||||
|
||||
type SrcWrap struct {
|
||||
Value Src
|
||||
}
|
||||
|
||||
type DstWrap struct {
|
||||
Value Dst
|
||||
}
|
||||
|
||||
// SrcToDstConverter is custom converting function for custom type.
|
||||
func SrcToDstConverter(src Src) (dst *Dst, err error) {
|
||||
return &Dst{B: src.A.Format("Y-m-d")}, nil
|
||||
}
|
||||
|
||||
// SrcToDstConverter is custom converting function for custom type.
|
||||
func main() {
|
||||
// register custom converter function.
|
||||
err := gconv.RegisterConverter(SrcToDstConverter)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// custom struct converting.
|
||||
var src = Src{A: gtime.Now()}
|
||||
dst := gconv.ConvertWithRefer(src, &Dst{})
|
||||
fmt.Println("src:", src)
|
||||
fmt.Println("dst:", dst)
|
||||
|
||||
// custom struct attributes converting.
|
||||
var srcWrap = SrcWrap{Src{A: gtime.Now()}}
|
||||
dstWrap := gconv.ConvertWithRefer(srcWrap, &DstWrap{})
|
||||
fmt.Println("srcWrap:", srcWrap)
|
||||
fmt.Println("dstWrap:", dstWrap)
|
||||
}
|
72
example/converter/alias_type_scan/main.go
Normal file
72
example/converter/alias_type_scan/main.go
Normal file
@ -0,0 +1,72 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
type MyTime = *gtime.Time
|
||||
|
||||
type Src struct {
|
||||
A MyTime
|
||||
}
|
||||
|
||||
type Dst struct {
|
||||
B string
|
||||
}
|
||||
|
||||
type SrcWrap struct {
|
||||
Value Src
|
||||
}
|
||||
|
||||
type DstWrap struct {
|
||||
Value Dst
|
||||
}
|
||||
|
||||
// SrcToDstConverter is custom converting function for custom type.
|
||||
func SrcToDstConverter(src Src) (dst *Dst, err error) {
|
||||
return &Dst{B: src.A.Format("Y-m-d")}, nil
|
||||
}
|
||||
|
||||
// SrcToDstConverter is custom converting function for custom type.
|
||||
func main() {
|
||||
// register custom converter function.
|
||||
err := gconv.RegisterConverter(SrcToDstConverter)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// custom struct converting.
|
||||
var (
|
||||
src = Src{A: gtime.Now()}
|
||||
dst *Dst
|
||||
)
|
||||
err = gconv.Scan(src, &dst)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Println("src:", src)
|
||||
fmt.Println("dst:", dst)
|
||||
|
||||
// custom struct attributes converting.
|
||||
var (
|
||||
srcWrap = SrcWrap{Src{A: gtime.Now()}}
|
||||
dstWrap *DstWrap
|
||||
)
|
||||
err = gconv.Scan(srcWrap, &dstWrap)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Println("srcWrap:", srcWrap)
|
||||
fmt.Println("dstWrap:", dstWrap)
|
||||
}
|
54
example/converter/struct_convert_with_refer/main.go
Normal file
54
example/converter/struct_convert_with_refer/main.go
Normal file
@ -0,0 +1,54 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
type Src struct {
|
||||
A int
|
||||
}
|
||||
|
||||
type Dst struct {
|
||||
B int
|
||||
}
|
||||
|
||||
type SrcWrap struct {
|
||||
Value Src
|
||||
}
|
||||
|
||||
type DstWrap struct {
|
||||
Value Dst
|
||||
}
|
||||
|
||||
// SrcToDstConverter is custom converting function for custom type.
|
||||
func SrcToDstConverter(src Src) (dst *Dst, err error) {
|
||||
return &Dst{B: src.A}, nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
// register custom converter function.
|
||||
err := gconv.RegisterConverter(SrcToDstConverter)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// custom struct converting.
|
||||
var src = Src{A: 1}
|
||||
dst := gconv.ConvertWithRefer(src, Dst{})
|
||||
fmt.Println("src:", src)
|
||||
fmt.Println("dst:", dst)
|
||||
|
||||
// custom struct attributes converting.
|
||||
var srcWrap = SrcWrap{Src{A: 1}}
|
||||
dstWrap := gconv.ConvertWithRefer(srcWrap, &DstWrap{})
|
||||
fmt.Println("srcWrap:", srcWrap)
|
||||
fmt.Println("dstWrap:", dstWrap)
|
||||
}
|
68
example/converter/struct_scan/main.go
Normal file
68
example/converter/struct_scan/main.go
Normal file
@ -0,0 +1,68 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
type Src struct {
|
||||
A int
|
||||
}
|
||||
|
||||
type Dst struct {
|
||||
B int
|
||||
}
|
||||
|
||||
type SrcWrap struct {
|
||||
Value Src
|
||||
}
|
||||
|
||||
type DstWrap struct {
|
||||
Value Dst
|
||||
}
|
||||
|
||||
func SrcToDstConverter(src Src) (dst *Dst, err error) {
|
||||
return &Dst{B: src.A}, nil
|
||||
}
|
||||
|
||||
// SrcToDstConverter is custom converting function for custom type.
|
||||
func main() {
|
||||
// register custom converter function.
|
||||
err := gconv.RegisterConverter(SrcToDstConverter)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// custom struct converting.
|
||||
var (
|
||||
src = Src{A: 1}
|
||||
dst *Dst
|
||||
)
|
||||
err = gconv.Scan(src, &dst)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Println("src:", src)
|
||||
fmt.Println("dst:", dst)
|
||||
|
||||
// custom struct attributes converting.
|
||||
var (
|
||||
srcWrap = SrcWrap{Src{A: 1}}
|
||||
dstWrap *DstWrap
|
||||
)
|
||||
err = gconv.Scan(srcWrap, &dstWrap)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
fmt.Println("srcWrap:", srcWrap)
|
||||
fmt.Println("dstWrap:", dstWrap)
|
||||
}
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,12 +1,19 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"golang.org/x/time/rate"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/net/ghttp"
|
||||
"golang.org/x/time/rate"
|
||||
)
|
||||
|
||||
type HelloReq struct {
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1 +1,7 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package packed
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -1,3 +1,9 @@
|
||||
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the MIT License.
|
||||
// If a copy of the MIT was not distributed with this file,
|
||||
// You can obtain one at https://github.com/gogf/gf.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -280,6 +280,17 @@ func doConvert(in doConvertInput) (convertedValue interface{}) {
|
||||
} else {
|
||||
referReflectValue = reflect.ValueOf(in.ReferValue)
|
||||
}
|
||||
var fromReflectValue reflect.Value
|
||||
if v, ok := in.FromValue.(reflect.Value); ok {
|
||||
fromReflectValue = v
|
||||
} else {
|
||||
fromReflectValue = reflect.ValueOf(in.FromValue)
|
||||
}
|
||||
|
||||
// custom converter.
|
||||
if dstReflectValue, ok, _ := callCustomConverterWithRefer(fromReflectValue, referReflectValue); ok {
|
||||
return dstReflectValue.Interface()
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if recover() != nil {
|
||||
|
@ -24,7 +24,7 @@ var customConverters = make(map[converterInType]map[converterOutType]converterFu
|
||||
|
||||
// RegisterConverter to register custom converter.
|
||||
// It must be registered before you use this custom converting feature.
|
||||
// It is suggested to do it in boot.
|
||||
// It is suggested to do it in boot procedure of the process.
|
||||
//
|
||||
// Note:
|
||||
// 1. The parameter `fn` must be defined as pattern `func(T1) (T2, error)`.
|
||||
@ -40,7 +40,7 @@ func RegisterConverter(fn interface{}) (err error) {
|
||||
!fnReflectType.Out(1).Implements(errType) {
|
||||
err = gerror.NewCodef(
|
||||
gcode.CodeInvalidParameter,
|
||||
"parameter must be type of function and defined as pattern `func(T1) (T2, error)`, but defined as `%s`",
|
||||
"parameter must be type of converter function and defined as pattern `func(T1) (T2, error)`, but defined as `%s`",
|
||||
fnReflectType.String(),
|
||||
)
|
||||
return
|
||||
@ -54,16 +54,16 @@ func RegisterConverter(fn interface{}) (err error) {
|
||||
if inType.Kind() == reflect.Pointer {
|
||||
err = gerror.NewCodef(
|
||||
gcode.CodeInvalidParameter,
|
||||
"invalid input parameter type `%s`: should not be type of pointer",
|
||||
inType.String(),
|
||||
"invalid converter function `%s`: invalid input parameter type `%s`, should not be type of pointer",
|
||||
fnReflectType.String(), inType.String(),
|
||||
)
|
||||
return
|
||||
}
|
||||
if outType.Kind() != reflect.Pointer {
|
||||
err = gerror.NewCodef(
|
||||
gcode.CodeInvalidParameter,
|
||||
"invalid output parameter type `%s`: should be type of pointer",
|
||||
outType.String(),
|
||||
"invalid converter function `%s`: invalid output parameter type `%s` should be type of pointer",
|
||||
fnReflectType.String(), outType.String(),
|
||||
)
|
||||
return
|
||||
}
|
||||
@ -85,39 +85,69 @@ func RegisterConverter(fn interface{}) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// callCustomConverter call the custom converter. It will try some possible type.
|
||||
func callCustomConverter(srcReflectValue reflect.Value, dstReflectValue reflect.Value) (converted bool, err error) {
|
||||
func getRegisteredConverterFuncAndSrcType(
|
||||
srcReflectValue, dstReflectValueForRefer reflect.Value,
|
||||
) (f converterFunc, srcType reflect.Type, ok bool) {
|
||||
if len(customConverters) == 0 {
|
||||
return false, nil
|
||||
return reflect.Value{}, nil, false
|
||||
}
|
||||
var (
|
||||
ok bool
|
||||
srcType = srcReflectValue.Type()
|
||||
)
|
||||
srcType = srcReflectValue.Type()
|
||||
for srcType.Kind() == reflect.Pointer {
|
||||
srcType = srcType.Elem()
|
||||
}
|
||||
var (
|
||||
registeredOutTypeMap map[converterOutType]converterFunc
|
||||
registeredConverterFunc converterFunc
|
||||
)
|
||||
var registeredOutTypeMap map[converterOutType]converterFunc
|
||||
// firstly, it searches the map by input parameter type.
|
||||
registeredOutTypeMap, ok = customConverters[srcType]
|
||||
if !ok {
|
||||
return false, nil
|
||||
return reflect.Value{}, nil, false
|
||||
}
|
||||
var dstType = dstReflectValue.Type()
|
||||
if dstType.Kind() == reflect.Pointer && dstReflectValue.Elem().Kind() == reflect.Pointer {
|
||||
dstType = dstReflectValue.Elem().Type()
|
||||
} else if dstType.Kind() != reflect.Pointer && dstReflectValue.CanAddr() {
|
||||
dstType = dstReflectValue.Addr().Type()
|
||||
var dstType = dstReflectValueForRefer.Type()
|
||||
if dstType.Kind() == reflect.Pointer {
|
||||
// Might be **struct, which is support as designed.
|
||||
if dstType.Elem().Kind() == reflect.Pointer {
|
||||
dstType = dstType.Elem()
|
||||
}
|
||||
} else if dstReflectValueForRefer.IsValid() && dstReflectValueForRefer.CanAddr() {
|
||||
dstType = dstReflectValueForRefer.Addr().Type()
|
||||
} else {
|
||||
dstType = reflect.PointerTo(dstType)
|
||||
}
|
||||
// secondly, it searches the input parameter type map
|
||||
// and finds the result converter function by the output parameter type.
|
||||
registeredConverterFunc, ok = registeredOutTypeMap[dstType]
|
||||
f, ok = registeredOutTypeMap[dstType]
|
||||
if !ok {
|
||||
return reflect.Value{}, nil, false
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func callCustomConverterWithRefer(
|
||||
srcReflectValue, referReflectValue reflect.Value,
|
||||
) (dstReflectValue reflect.Value, converted bool, err error) {
|
||||
registeredConverterFunc, srcType, ok := getRegisteredConverterFuncAndSrcType(srcReflectValue, referReflectValue)
|
||||
if !ok {
|
||||
return reflect.Value{}, false, nil
|
||||
}
|
||||
dstReflectValue = reflect.New(referReflectValue.Type()).Elem()
|
||||
converted, err = doCallCustomConverter(srcReflectValue, dstReflectValue, registeredConverterFunc, srcType)
|
||||
return
|
||||
}
|
||||
|
||||
// callCustomConverter call the custom converter. It will try some possible type.
|
||||
func callCustomConverter(srcReflectValue, dstReflectValue reflect.Value) (converted bool, err error) {
|
||||
registeredConverterFunc, srcType, ok := getRegisteredConverterFuncAndSrcType(srcReflectValue, dstReflectValue)
|
||||
if !ok {
|
||||
return false, nil
|
||||
}
|
||||
return doCallCustomConverter(srcReflectValue, dstReflectValue, registeredConverterFunc, srcType)
|
||||
}
|
||||
|
||||
func doCallCustomConverter(
|
||||
srcReflectValue reflect.Value,
|
||||
dstReflectValue reflect.Value,
|
||||
registeredConverterFunc converterFunc,
|
||||
srcType reflect.Type,
|
||||
) (converted bool, err error) {
|
||||
// Converter function calling.
|
||||
for srcReflectValue.Type() != srcType {
|
||||
srcReflectValue = srcReflectValue.Elem()
|
||||
|
@ -16,6 +16,52 @@ import (
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
func TestConverter_ConvertWithRefer(t *testing.T) {
|
||||
type tA struct {
|
||||
Val int
|
||||
}
|
||||
|
||||
type tB struct {
|
||||
Val1 int32
|
||||
Val2 string
|
||||
}
|
||||
|
||||
gtest.C(t, func(t *gtest.T) {
|
||||
err := gconv.RegisterConverter(func(a tA) (b *tB, err error) {
|
||||
b = &tB{
|
||||
Val1: int32(a.Val),
|
||||
Val2: "abcd",
|
||||
}
|
||||
return
|
||||
})
|
||||
t.AssertNil(err)
|
||||
})
|
||||
|
||||
gtest.C(t, func(t *gtest.T) {
|
||||
a := &tA{
|
||||
Val: 1,
|
||||
}
|
||||
var b tB
|
||||
result := gconv.ConvertWithRefer(a, &b)
|
||||
t.Assert(result.(*tB), &tB{
|
||||
Val1: 1,
|
||||
Val2: "abcd",
|
||||
})
|
||||
})
|
||||
|
||||
gtest.C(t, func(t *gtest.T) {
|
||||
a := &tA{
|
||||
Val: 1,
|
||||
}
|
||||
var b tB
|
||||
result := gconv.ConvertWithRefer(a, b)
|
||||
t.Assert(result.(tB), tB{
|
||||
Val1: 1,
|
||||
Val2: "abcd",
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestConverter_Struct(t *testing.T) {
|
||||
type tA struct {
|
||||
Val int
|
||||
|
Loading…
Reference in New Issue
Block a user