mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +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.
119 lines
3.8 KiB
Go
119 lines
3.8 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 gdb
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
)
|
|
|
|
// Stmt is a prepared statement.
|
|
// A Stmt is safe for concurrent use by multiple goroutines.
|
|
//
|
|
// If a Stmt is prepared on a Tx or Conn, it will be bound to a single
|
|
// underlying connection forever. If the Tx or Conn closes, the Stmt will
|
|
// become unusable and all operations will return an error.
|
|
// If a Stmt is prepared on a DB, it will remain usable for the lifetime of the
|
|
// DB. When the Stmt needs to execute on a new underlying connection, it will
|
|
// prepare itself on the new connection automatically.
|
|
type Stmt struct {
|
|
*sql.Stmt
|
|
core *Core
|
|
link Link
|
|
sql string
|
|
}
|
|
|
|
// ExecContext executes a prepared statement with the given arguments and
|
|
// returns a Result summarizing the effect of the statement.
|
|
func (s *Stmt) ExecContext(ctx context.Context, args ...any) (sql.Result, error) {
|
|
out, err := s.core.db.DoCommit(ctx, DoCommitInput{
|
|
Stmt: s.Stmt,
|
|
Link: s.link,
|
|
Sql: s.sql,
|
|
Args: args,
|
|
Type: SqlTypeStmtExecContext,
|
|
IsTransaction: s.link.IsTransaction(),
|
|
})
|
|
return out.Result, err
|
|
}
|
|
|
|
// QueryContext executes a prepared query statement with the given arguments
|
|
// and returns the query results as a *Rows.
|
|
func (s *Stmt) QueryContext(ctx context.Context, args ...any) (*sql.Rows, error) {
|
|
out, err := s.core.db.DoCommit(ctx, DoCommitInput{
|
|
Stmt: s.Stmt,
|
|
Link: s.link,
|
|
Sql: s.sql,
|
|
Args: args,
|
|
Type: SqlTypeStmtQueryContext,
|
|
IsTransaction: s.link.IsTransaction(),
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if out.RawResult != nil {
|
|
return out.RawResult.(*sql.Rows), err
|
|
}
|
|
return nil, nil
|
|
}
|
|
|
|
// QueryRowContext executes a prepared query statement with the given arguments.
|
|
// If an error occurs during the execution of the statement, that error will
|
|
// be returned by a call to Scan on the returned *Row, which is always non-nil.
|
|
// If the query selects no rows, the *Row's Scan will return ErrNoRows.
|
|
// Otherwise, the *Row's Scan scans the first selected row and discards
|
|
// the rest.
|
|
func (s *Stmt) QueryRowContext(ctx context.Context, args ...any) *sql.Row {
|
|
out, err := s.core.db.DoCommit(ctx, DoCommitInput{
|
|
Stmt: s.Stmt,
|
|
Link: s.link,
|
|
Sql: s.sql,
|
|
Args: args,
|
|
Type: SqlTypeStmtQueryContext,
|
|
IsTransaction: s.link.IsTransaction(),
|
|
})
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if out.RawResult != nil {
|
|
return out.RawResult.(*sql.Row)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Exec executes a prepared statement with the given arguments and
|
|
// returns a Result summarizing the effect of the statement.
|
|
func (s *Stmt) Exec(args ...any) (sql.Result, error) {
|
|
return s.ExecContext(context.Background(), args...)
|
|
}
|
|
|
|
// Query executes a prepared query statement with the given arguments
|
|
// and returns the query results as a *Rows.
|
|
func (s *Stmt) Query(args ...any) (*sql.Rows, error) {
|
|
return s.QueryContext(context.Background(), args...)
|
|
}
|
|
|
|
// QueryRow executes a prepared query statement with the given arguments.
|
|
// If an error occurs during the execution of the statement, that error will
|
|
// be returned by a call to Scan on the returned *Row, which is always non-nil.
|
|
// If the query selects no rows, the *Row's Scan will return ErrNoRows.
|
|
// Otherwise, the *Row's Scan scans the first selected row and discards
|
|
// the rest.
|
|
//
|
|
// Example usage:
|
|
//
|
|
// var name string
|
|
// err := nameByUseridStmt.QueryRow(id).Scan(&name)
|
|
func (s *Stmt) QueryRow(args ...any) *sql.Row {
|
|
return s.QueryRowContext(context.Background(), args...)
|
|
}
|
|
|
|
// Close closes the statement.
|
|
func (s *Stmt) Close() error {
|
|
return s.Stmt.Close()
|
|
}
|