Files
gf/os/gview/gview_buildin.go
hailaz ee24da4e72 refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
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.
2025-08-28 16:53:19 +08:00

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)
}