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.
152 lines
5.8 KiB
Go
152 lines
5.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 gsvc provides service registry and discovery definition.
|
|
package gsvc
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
)
|
|
|
|
// Registry interface for service.
|
|
type Registry interface {
|
|
Registrar
|
|
Discovery
|
|
}
|
|
|
|
// Registrar interface for service registrar.
|
|
type Registrar interface {
|
|
// Register registers `service` to Registry.
|
|
// Note that it returns a new Service if it changes the input Service with custom one.
|
|
Register(ctx context.Context, service Service) (registered Service, err error)
|
|
|
|
// Deregister off-lines and removes `service` from the Registry.
|
|
Deregister(ctx context.Context, service Service) error
|
|
}
|
|
|
|
// Discovery interface for service discovery.
|
|
type Discovery interface {
|
|
// Search searches and returns services with specified condition.
|
|
Search(ctx context.Context, in SearchInput) (result []Service, err error)
|
|
|
|
// Watch watches specified condition changes.
|
|
// The `key` is the prefix of service key.
|
|
Watch(ctx context.Context, key string) (watcher Watcher, err error)
|
|
}
|
|
|
|
// Watcher interface for service.
|
|
type Watcher interface {
|
|
// Proceed proceeds watch in blocking way.
|
|
// It returns all complete services that watched by `key` if any change.
|
|
Proceed() (services []Service, err error)
|
|
|
|
// Close closes the watcher.
|
|
Close() error
|
|
}
|
|
|
|
// Service interface for service definition.
|
|
type Service interface {
|
|
// GetName returns the name of the service.
|
|
// The name is necessary for a service, and should be unique among services.
|
|
GetName() string
|
|
|
|
// GetVersion returns the version of the service.
|
|
// It is suggested using GNU version naming like: v1.0.0, v2.0.1, v2.1.0-rc.
|
|
// A service can have multiple versions deployed at once.
|
|
// If no version set in service, the default version of service is "latest".
|
|
GetVersion() string
|
|
|
|
// GetKey formats and returns a unique key string for service.
|
|
// The result key is commonly used for key-value registrar server.
|
|
GetKey() string
|
|
|
|
// GetValue formats and returns the value of the service.
|
|
// The result value is commonly used for key-value registrar server.
|
|
GetValue() string
|
|
|
|
// GetPrefix formats and returns the key prefix string.
|
|
// The result prefix string is commonly used in key-value registrar server
|
|
// for service searching.
|
|
//
|
|
// Take etcd server for example, the prefix string is used like:
|
|
// `etcdctl get /services/prod/hello.svc --prefix`
|
|
GetPrefix() string
|
|
|
|
// GetMetadata returns the Metadata map of service.
|
|
// The Metadata is key-value pair map specifying extra attributes of a service.
|
|
GetMetadata() Metadata
|
|
|
|
// GetEndpoints returns the Endpoints of service.
|
|
// The Endpoints contain multiple host/port information of service.
|
|
GetEndpoints() Endpoints
|
|
}
|
|
|
|
// Endpoint interface for service.
|
|
type Endpoint interface {
|
|
// Host returns the IPv4/IPv6 address of a service.
|
|
Host() string
|
|
|
|
// Port returns the port of a service.
|
|
Port() int
|
|
|
|
// String formats and returns the Endpoint as a string.
|
|
String() string
|
|
}
|
|
|
|
// Endpoints are composed by multiple Endpoint.
|
|
type Endpoints []Endpoint
|
|
|
|
// Metadata stores custom key-value pairs.
|
|
type Metadata map[string]any
|
|
|
|
// SearchInput is the input for service searching.
|
|
type SearchInput struct {
|
|
Prefix string // Search by key prefix.
|
|
Name string // Search by service name.
|
|
Version string // Search by service version.
|
|
Metadata Metadata // Filter by metadata if there are multiple result.
|
|
}
|
|
|
|
const (
|
|
Schema = `service` // Schema is the schema of service.
|
|
DefaultHead = `service` // DefaultHead is the default head of service.
|
|
DefaultDeployment = `default` // DefaultDeployment is the default deployment of service.
|
|
DefaultNamespace = `default` // DefaultNamespace is the default namespace of service.
|
|
DefaultVersion = `latest` // DefaultVersion is the default version of service.
|
|
EnvPrefix = `GF_GSVC_PREFIX` // EnvPrefix is the environment variable prefix.
|
|
EnvDeployment = `GF_GSVC_DEPLOYMENT` // EnvDeployment is the environment variable deployment.
|
|
EnvNamespace = `GF_GSVC_NAMESPACE` // EnvNamespace is the environment variable namespace.
|
|
EnvName = `GF_GSVC_Name` // EnvName is the environment variable name.
|
|
EnvVersion = `GF_GSVC_VERSION` // EnvVersion is the environment variable version.
|
|
MDProtocol = `protocol` // MDProtocol is the metadata key for protocol.
|
|
MDInsecure = `insecure` // MDInsecure is the metadata key for insecure.
|
|
MDWeight = `weight` // MDWeight is the metadata key for weight.
|
|
DefaultProtocol = `http` // DefaultProtocol is the default protocol of service.
|
|
DefaultSeparator = "/" // DefaultSeparator is the default separator of service.
|
|
EndpointHostPortDelimiter = ":" // EndpointHostPortDelimiter is the delimiter of host and port.
|
|
defaultTimeout = 5 * time.Second // defaultTimeout is the default timeout for service registry.
|
|
EndpointsDelimiter = "," // EndpointsDelimiter is the delimiter of endpoints.
|
|
)
|
|
|
|
var defaultRegistry Registry
|
|
|
|
// SetRegistry sets the default Registry implements as your own implemented interface.
|
|
func SetRegistry(registry Registry) {
|
|
if registry == nil {
|
|
panic(gerror.New(`invalid Registry value "nil" given`))
|
|
}
|
|
defaultRegistry = registry
|
|
}
|
|
|
|
// GetRegistry returns the default Registry that is previously set.
|
|
// It returns nil if no Registry is set.
|
|
func GetRegistry() Registry {
|
|
return defaultRegistry
|
|
}
|