Use reflect.TypeOf() and reflect.ValueOf() to get the type and value of the variable, where ValueOf returns a copy; 2. You can traverse the structure fields through reflection to obtain the field name, type and label information; 3. To modify the value, you need to pass a pointer and call Elem() to get the addressable value, and you need to check CanSet(); 4. You can traverse the structure fields and set a new value according to the type; 5. Get the method through MethodByName() and call it with Call(); 6. You can determine whether the type implements a specific method or interface; the reflection performance is low, so you should avoid using a hot path. When modifying the value, you must pass a pointer. The field that has not been exported cannot be modified. Type judgment is preferred to use Kind(). This mechanism is very practical in JSON serialization, ORM and configuration parsing.
In Go, reflection is a powerful mechanism that allows programs to check the types and values of variables at runtime, and even modify them. Go's reflect
package provides the main functions to implement reflection. Here are a few common examples to illustrate how to use Go's reflection.

1. Reflection of basic types and values
Use reflect.TypeOf()
and reflect.ValueOf()
to get the type and value of a variable.
package main import ( "fmt" "reflect" ) func main() { var x int = 42 t := reflect.TypeOf(x) // Type information v := reflect.ValueOf(x) // Value information fmt.Println("Type:", t) // int fmt.Println("Value:", v) // 42 fmt.Println("Kind:", v.Kind()) // int }
Note:
reflect.ValueOf(x)
returns a copy ofx
, not a reference.
2. Get structure field information
Reflection is often used to process structures, such as obtaining field names, types, labels, etc.
type User struct { Name string `json:"name"` Age int `json:"age"` } func main() { var u User t := reflect.TypeOf(u) for i := 0; i < t.NumField(); i { field := t.Field(i) fmt.Printf("Field name: %s, Type: %s, JSON tag: %s\n", field.Name, field.Type, field.Tag.Get("json")) } }
Output:

Field name: Name, Type: string, JSON tag: name Field name: Age, Type: int, JSON Tag: age
3. Modify the value of the variable (need to pass in pointer)
If you want to modify the value through reflection, you must pass in a pointer, otherwise it will be panic.
func main() { var x int = 10 v := reflect.ValueOf(&x) // Pass in pointer elem := v.Elem() // Get the value pointed to by the pointer if elem.CanSet() { elem.SetInt(20) } fmt.Println(x) // Output: 20 }
elem.CanSet()
determines whether the value can be modified (for example, fields that are not exported cannot be set).
4. Traversing and setting structure fields
type Person struct { Name string Age int } func main() { p := Person{Name: "Alice", Age: 0} v := reflect.ValueOf(&p).Elem() // Get the modifiable value pointed to by the pointer for i := 0; i < v.NumField(); i { field := v.Field(i) if field.CanSet() && field.Kind() == reflect.Int { field.SetInt(25) } } fmt.Printf("% v\n", p) // {Name:Alice Age:25} }
5. Calling method (by reflection)
type Greeter struct{} func (g Greeter) SayHello(name string) { fmt.Println("Hello,", name) } func main() { g := Greeter{} v := reflect.ValueOf(g) // Get method method:= v.MethodByName("SayHello") if method.IsValid() { args := []reflect.Value{reflect.ValueOf("Bob")} method.Call(args) // Output: Hello, Bob } }
6. Determine whether the type implements an interface
type Speaker interface { Speak() string } type Dog struct{} func (d Dog) Speak() string { return "Woof!" } func main() { d := Dog{} t := reflect.TypeOf(d) _, ok := t.MethodByName("Speak") fmt.Println("Implements the Speak method:", ok) // true // Or more accurately determine whether the interface is implemented_, implements := reflect.TypeOf((*Speaker)(nil)).Elem().MethodByName("Speak") fmt.Println("Interface defines Speak:", implements) }
Summary: Common operations for reflection
-
reflect.TypeOf(v)
→ Get type -
reflect.ValueOf(v)
→ Get the value -
.Kind()
→ Basic types (such asint
,struct
,slice
, etc.) -
.Elem()
→ Pointer, interface underlying value -
.Field(i)
/.Method(i)
→ Get field or method -
.SetXXX()
→ Modify the value (requires addressable) -
.Call()
→ Call method
Things to note
- The reflection performance is low, so try to avoid using it in the hot path.
- When modifying values with reflection, a pointer must be passed in, otherwise it cannot be modified.
- Note whether the field can be exported (first letter), otherwise
CanSet()
is false. - Use
Kind()
instead ofType()
to judge type more, becauseKind
returns the underlying type.
Basically these common uses. Although Go's reflection is not as flexible as other languages, it is very practical in scenarios such as serialization (such as JSON), ORM, configuration parsing, etc.
The above is the detailed content of go by example reflection. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

SetupaMaven/GradleprojectwithJAX-RSdependencieslikeJersey;2.CreateaRESTresourceusingannotationssuchas@Pathand@GET;3.ConfiguretheapplicationviaApplicationsubclassorweb.xml;4.AddJacksonforJSONbindingbyincludingjersey-media-json-jackson;5.DeploytoaJakar

Maven is a standard tool for Java project management and construction. The answer lies in the fact that it uses pom.xml to standardize project structure, dependency management, construction lifecycle automation and plug-in extensions; 1. Use pom.xml to define groupId, artifactId, version and dependencies; 2. Master core commands such as mvnclean, compile, test, package, install and deploy; 3. Use dependencyManagement and exclusions to manage dependency versions and conflicts; 4. Organize large applications through multi-module project structure and are managed uniformly by the parent POM; 5.

First, use JavaScript to obtain the user system preferences and locally stored theme settings, and initialize the page theme; 1. The HTML structure contains a button to trigger topic switching; 2. CSS uses: root to define bright theme variables, .dark-mode class defines dark theme variables, and applies these variables through var(); 3. JavaScript detects prefers-color-scheme and reads localStorage to determine the initial theme; 4. Switch the dark-mode class on the html element when clicking the button, and saves the current state to localStorage; 5. All color changes are accompanied by 0.3 seconds transition animation to enhance the user

@property decorator is used to convert methods into properties to implement the reading, setting and deletion control of properties. 1. Basic usage: define read-only attributes through @property, such as area calculated based on radius and accessed directly; 2. Advanced usage: use @name.setter and @name.deleter to implement attribute assignment verification and deletion operations; 3. Practical application: perform data verification in setters, such as BankAccount to ensure that the balance is not negative; 4. Naming specification: internal variables are prefixed, property method names are consistent with attributes, and unified access control is used to improve code security and maintainability.

To generate hash values using Java, it can be implemented through the MessageDigest class. 1. Get an instance of the specified algorithm, such as MD5 or SHA-256; 2. Call the .update() method to pass in the data to be encrypted; 3. Call the .digest() method to obtain a hash byte array; 4. Convert the byte array into a hexadecimal string for reading; for inputs such as large files, read in chunks and call .update() multiple times; it is recommended to use SHA-256 instead of MD5 or SHA-1 to ensure security.

Yes, a common CSS drop-down menu can be implemented through pure HTML and CSS without JavaScript. 1. Use nested ul and li to build a menu structure; 2. Use the:hover pseudo-class to control the display and hiding of pull-down content; 3. Set position:relative for parent li, and the submenu is positioned using position:absolute; 4. The submenu defaults to display:none, which becomes display:block when hovered; 5. Multi-level pull-down can be achieved through nesting, combined with transition, and add fade-in animations, and adapted to mobile terminals with media queries. The entire solution is simple and does not require JavaScript support, which is suitable for large

Use datetime.strptime() to convert date strings into datetime object. 1. Basic usage: parse "2023-10-05" as datetime object through "%Y-%m-%d"; 2. Supports multiple formats such as "%m/%d/%Y" to parse American dates, "%d/%m/%Y" to parse British dates, "%b%d,%Y%I:%M%p" to parse time with AM/PM; 3. Use dateutil.parser.parse() to automatically infer unknown formats; 4. Use .d

Converting an array into a list in Java requires selecting methods based on the data type and requirements. ① Use Arrays.asList() to quickly convert an object array (such as String[]) into a fixed-size List, but elements cannot be added or deleted; ② If you need a mutable list, you can encapsulate the result of Arrays.asList() through the ArrayList constructor; ③ For basic type arrays (such as int[]), you need to use StreamAPI conversion, such as Arrays.stream().boxed().collect(Collectors.toList()); ④ Notes include avoiding null arrays, distinguishing basic types from object types, and explicitly returning columns
