mirror of
https://gitee.com/johng/gf
synced 2026-06-06 02:25:47 +08:00
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
315 lines
9.9 KiB
Go
315 lines
9.9 KiB
Go
// 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 gview
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
htmltpl "html/template"
|
|
"strings"
|
|
|
|
"github.com/gogf/gf/v2/encoding/ghtml"
|
|
"github.com/gogf/gf/v2/encoding/gjson"
|
|
"github.com/gogf/gf/v2/encoding/gurl"
|
|
"github.com/gogf/gf/v2/os/gtime"
|
|
"github.com/gogf/gf/v2/text/gstr"
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|
"github.com/gogf/gf/v2/util/gmode"
|
|
"github.com/gogf/gf/v2/util/gutil"
|
|
)
|
|
|
|
// buildInFuncDump implements build-in template function: dump
|
|
func (view *View) buildInFuncDump(values ...any) string {
|
|
buffer := bytes.NewBuffer(nil)
|
|
buffer.WriteString("\n")
|
|
buffer.WriteString("<!--\n")
|
|
if gmode.IsDevelop() {
|
|
for _, v := range values {
|
|
gutil.DumpTo(buffer, v, gutil.DumpOption{})
|
|
buffer.WriteString("\n")
|
|
}
|
|
} else {
|
|
buffer.WriteString("dump feature is disabled as process is not running in develop mode\n")
|
|
}
|
|
buffer.WriteString("-->\n")
|
|
return buffer.String()
|
|
}
|
|
|
|
// buildInFuncMap implements build-in template function: map
|
|
func (view *View) buildInFuncMap(value ...any) map[string]any {
|
|
if len(value) > 0 {
|
|
return gconv.Map(value[0])
|
|
}
|
|
return map[string]any{}
|
|
}
|
|
|
|
// buildInFuncMaps implements build-in template function: maps
|
|
func (view *View) buildInFuncMaps(value ...any) []map[string]any {
|
|
if len(value) > 0 {
|
|
return gconv.Maps(value[0])
|
|
}
|
|
return []map[string]any{}
|
|
}
|
|
|
|
// buildInFuncEq implements build-in template function: eq
|
|
func (view *View) buildInFuncEq(value any, others ...any) bool {
|
|
s := gconv.String(value)
|
|
for _, v := range others {
|
|
if strings.Compare(s, gconv.String(v)) == 0 {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// buildInFuncNe implements build-in template function: ne
|
|
func (view *View) buildInFuncNe(value, other any) bool {
|
|
return strings.Compare(gconv.String(value), gconv.String(other)) != 0
|
|
}
|
|
|
|
// buildInFuncLt implements build-in template function: lt
|
|
func (view *View) buildInFuncLt(value, other any) bool {
|
|
s1 := gconv.String(value)
|
|
s2 := gconv.String(other)
|
|
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
|
|
return gconv.Int64(value) < gconv.Int64(other)
|
|
}
|
|
return strings.Compare(s1, s2) < 0
|
|
}
|
|
|
|
// buildInFuncLe implements build-in template function: le
|
|
func (view *View) buildInFuncLe(value, other any) bool {
|
|
s1 := gconv.String(value)
|
|
s2 := gconv.String(other)
|
|
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
|
|
return gconv.Int64(value) <= gconv.Int64(other)
|
|
}
|
|
return strings.Compare(s1, s2) <= 0
|
|
}
|
|
|
|
// buildInFuncGt implements build-in template function: gt
|
|
func (view *View) buildInFuncGt(value, other any) bool {
|
|
s1 := gconv.String(value)
|
|
s2 := gconv.String(other)
|
|
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
|
|
return gconv.Int64(value) > gconv.Int64(other)
|
|
}
|
|
return strings.Compare(s1, s2) > 0
|
|
}
|
|
|
|
// buildInFuncGe implements build-in template function: ge
|
|
func (view *View) buildInFuncGe(value, other any) bool {
|
|
s1 := gconv.String(value)
|
|
s2 := gconv.String(other)
|
|
if gstr.IsNumeric(s1) && gstr.IsNumeric(s2) {
|
|
return gconv.Int64(value) >= gconv.Int64(other)
|
|
}
|
|
return strings.Compare(s1, s2) >= 0
|
|
}
|
|
|
|
// buildInFuncInclude implements build-in template function: include
|
|
// Note that configuration AutoEncode does not affect the output of this function.
|
|
func (view *View) buildInFuncInclude(file any, data ...map[string]any) htmltpl.HTML {
|
|
var m map[string]any = nil
|
|
if len(data) > 0 {
|
|
m = data[0]
|
|
}
|
|
path := gconv.String(file)
|
|
if path == "" {
|
|
return ""
|
|
}
|
|
// It will search the file internally.
|
|
content, err := view.Parse(context.TODO(), path, m)
|
|
if err != nil {
|
|
return htmltpl.HTML(err.Error())
|
|
}
|
|
return htmltpl.HTML(content)
|
|
}
|
|
|
|
// buildInFuncText implements build-in template function: text
|
|
func (view *View) buildInFuncText(html any) string {
|
|
return ghtml.StripTags(gconv.String(html))
|
|
}
|
|
|
|
// buildInFuncHtmlEncode implements build-in template function: html
|
|
func (view *View) buildInFuncHtmlEncode(html any) string {
|
|
return ghtml.Entities(gconv.String(html))
|
|
}
|
|
|
|
// buildInFuncHtmlDecode implements build-in template function: htmldecode
|
|
func (view *View) buildInFuncHtmlDecode(html any) string {
|
|
return ghtml.EntitiesDecode(gconv.String(html))
|
|
}
|
|
|
|
// buildInFuncUrlEncode implements build-in template function: url
|
|
func (view *View) buildInFuncUrlEncode(url any) string {
|
|
return gurl.Encode(gconv.String(url))
|
|
}
|
|
|
|
// buildInFuncUrlDecode implements build-in template function: urldecode
|
|
func (view *View) buildInFuncUrlDecode(url any) string {
|
|
if content, err := gurl.Decode(gconv.String(url)); err == nil {
|
|
return content
|
|
} else {
|
|
return err.Error()
|
|
}
|
|
}
|
|
|
|
// buildInFuncDate implements build-in template function: date
|
|
func (view *View) buildInFuncDate(format any, timestamp ...any) string {
|
|
t := int64(0)
|
|
if len(timestamp) > 0 {
|
|
t = gconv.Int64(timestamp[0])
|
|
}
|
|
if t == 0 {
|
|
t = gtime.Timestamp()
|
|
}
|
|
return gtime.NewFromTimeStamp(t).Format(gconv.String(format))
|
|
}
|
|
|
|
// buildInFuncCompare implements build-in template function: compare
|
|
func (view *View) buildInFuncCompare(value1, value2 any) int {
|
|
return strings.Compare(gconv.String(value1), gconv.String(value2))
|
|
}
|
|
|
|
// buildInFuncSubStr implements build-in template function: substr
|
|
func (view *View) buildInFuncSubStr(start, end, str any) string {
|
|
return gstr.SubStrRune(gconv.String(str), gconv.Int(start), gconv.Int(end))
|
|
}
|
|
|
|
// buildInFuncStrLimit implements build-in template function: strlimit
|
|
func (view *View) buildInFuncStrLimit(length, suffix, str any) string {
|
|
return gstr.StrLimitRune(gconv.String(str), gconv.Int(length), gconv.String(suffix))
|
|
}
|
|
|
|
// buildInFuncConcat implements build-in template function: concat
|
|
func (view *View) buildInFuncConcat(str ...any) string {
|
|
var s string
|
|
for _, v := range str {
|
|
s += gconv.String(v)
|
|
}
|
|
return s
|
|
}
|
|
|
|
// buildInFuncReplace implements build-in template function: replace
|
|
func (view *View) buildInFuncReplace(search, replace, str any) string {
|
|
return gstr.Replace(gconv.String(str), gconv.String(search), gconv.String(replace), -1)
|
|
}
|
|
|
|
// buildInFuncHighlight implements build-in template function: highlight
|
|
func (view *View) buildInFuncHighlight(key, color, str any) string {
|
|
return gstr.Replace(gconv.String(str), gconv.String(key), fmt.Sprintf(`<span style="color:%v;">%v</span>`, color, key))
|
|
}
|
|
|
|
// buildInFuncHideStr implements build-in template function: hidestr
|
|
func (view *View) buildInFuncHideStr(percent, hide, str any) string {
|
|
return gstr.HideStr(gconv.String(str), gconv.Int(percent), gconv.String(hide))
|
|
}
|
|
|
|
// buildInFuncToUpper implements build-in template function: toupper
|
|
func (view *View) buildInFuncToUpper(str any) string {
|
|
return gstr.ToUpper(gconv.String(str))
|
|
}
|
|
|
|
// buildInFuncToLower implements build-in template function: toupper
|
|
func (view *View) buildInFuncToLower(str any) string {
|
|
return gstr.ToLower(gconv.String(str))
|
|
}
|
|
|
|
// buildInFuncNl2Br implements build-in template function: nl2br
|
|
func (view *View) buildInFuncNl2Br(str any) string {
|
|
return gstr.Nl2Br(gconv.String(str))
|
|
}
|
|
|
|
// buildInFuncJson implements build-in template function: json ,
|
|
// which encodes and returns `value` as JSON string.
|
|
func (view *View) buildInFuncJson(value any) (string, error) {
|
|
b, err := gjson.Marshal(value)
|
|
return string(b), err
|
|
}
|
|
|
|
// buildInFuncXml implements build-in template function: xml ,
|
|
// which encodes and returns `value` as XML string.
|
|
func (view *View) buildInFuncXml(value any, rootTag ...string) (string, error) {
|
|
b, err := gjson.New(value).ToXml(rootTag...)
|
|
return string(b), err
|
|
}
|
|
|
|
// buildInFuncIni implements build-in template function: ini ,
|
|
// which encodes and returns `value` as XML string.
|
|
func (view *View) buildInFuncIni(value any) (string, error) {
|
|
b, err := gjson.New(value).ToIni()
|
|
return string(b), err
|
|
}
|
|
|
|
// buildInFuncYaml implements build-in template function: yaml ,
|
|
// which encodes and returns `value` as YAML string.
|
|
func (view *View) buildInFuncYaml(value any) (string, error) {
|
|
b, err := gjson.New(value).ToYaml()
|
|
return string(b), err
|
|
}
|
|
|
|
// buildInFuncYamlIndent implements build-in template function: yamli ,
|
|
// which encodes and returns `value` as YAML string with custom indent string.
|
|
func (view *View) buildInFuncYamlIndent(value, indent any) (string, error) {
|
|
b, err := gjson.New(value).ToYamlIndent(gconv.String(indent))
|
|
return string(b), err
|
|
}
|
|
|
|
// buildInFuncToml implements build-in template function: toml ,
|
|
// which encodes and returns `value` as TOML string.
|
|
func (view *View) buildInFuncToml(value any) (string, error) {
|
|
b, err := gjson.New(value).ToToml()
|
|
return string(b), err
|
|
}
|
|
|
|
// buildInFuncPlus implements build-in template function: plus ,
|
|
// which returns the result that pluses all `deltas` to `value`.
|
|
func (view *View) buildInFuncPlus(value any, deltas ...any) string {
|
|
result := gconv.Float64(value)
|
|
for _, v := range deltas {
|
|
result += gconv.Float64(v)
|
|
}
|
|
return gconv.String(result)
|
|
}
|
|
|
|
// buildInFuncMinus implements build-in template function: minus ,
|
|
// which returns the result that subtracts all `deltas` from `value`.
|
|
func (view *View) buildInFuncMinus(value any, deltas ...any) string {
|
|
result := gconv.Float64(value)
|
|
for _, v := range deltas {
|
|
result -= gconv.Float64(v)
|
|
}
|
|
return gconv.String(result)
|
|
}
|
|
|
|
// buildInFuncTimes implements build-in template function: times ,
|
|
// which returns the result that multiplies `value` by all of `values`.
|
|
func (view *View) buildInFuncTimes(value any, values ...any) string {
|
|
result := gconv.Float64(value)
|
|
for _, v := range values {
|
|
result *= gconv.Float64(v)
|
|
}
|
|
return gconv.String(result)
|
|
}
|
|
|
|
// buildInFuncDivide implements build-in template function: divide ,
|
|
// which returns the result that divides `value` by all of `values`.
|
|
func (view *View) buildInFuncDivide(value any, values ...any) string {
|
|
result := gconv.Float64(value)
|
|
for _, v := range values {
|
|
value2Float64 := gconv.Float64(v)
|
|
if value2Float64 == 0 {
|
|
// Invalid `value2`.
|
|
return "0"
|
|
}
|
|
result /= value2Float64
|
|
}
|
|
return gconv.String(result)
|
|
}
|