反映。Golang 中的 CanSet()函数及示例
原文:https://www . geesforgeks . org/reflect-can set-function-in-golang-with-examples/
Go 语言提供了运行时反射的内置支持实现,并允许程序在反射包的帮助下操作任意类型的对象。反映。Golang 中的 CanSet() 功能用于检查 v 的值是否可以更改。要访问这个函数,需要在程序中导入反射包。
语法:
```go func (v Value) CanSet() bool
```
参数:此功能不接受任何参数。
返回值:该函数返回布尔值。
以下示例说明了上述方法在 Golang 中的使用:
例 1:
// Golang program to illustrate
// reflect.CanSet() Function
package main
import (
"reflect"
"fmt"
)
type ProductionInfo struct {
StructA []Entry
}
type Entry struct {
Field1 string
Field2 int
}
func SetField(source interface{}, fieldName string, fieldValue string){
v := reflect.ValueOf(source)
tt := reflect.TypeOf(source)
for k := 0; k < tt.NumField(); k++ {
fieldValue := reflect.ValueOf(v.Field(k))
// use of CanSet() method
fmt.Println(fieldValue.CanSet())
if fieldValue.CanSet(){
fieldValue.SetString(fieldValue.String())
}
}
}
// Main function
func main() {
source := ProductionInfo{}
source.StructA = append(source.StructA, Entry{Field1: "A", Field2: 2})
SetField(source, "Field1", "NEW_VALUE")
}
输出:
false
例 2:
// Golang program to illustrate
// reflect.CanSet() Function
package main
import (
"fmt"
"reflect"
)
type ProductionInfo struct {
StructA []Entry
}
type Entry struct {
Field1 string
Field2 int
}
func SetField(source interface{}, fieldName string, fieldValue string) {
v := reflect.ValueOf(source).Elem()
// use of CanSet() method
fmt.Println(v.FieldByName(fieldName).CanSet())
if v.FieldByName(fieldName).CanSet() {
v.FieldByName(fieldName).SetString(fieldValue)
}
}
// Main function
func main() {
source := ProductionInfo{}
source.StructA = append(source.StructA, Entry{Field1: "A", Field2: 2})
fmt.Println("Before: ", source.StructA[0])
SetField(&source.StructA[0], "Field1", "NEW_VALUE")
fmt.Println("After: ", source.StructA[0])
}
输出:
Before: {A 2}
true
After: {NEW_VALUE 2}
版权属于:月萌API www.moonapi.com,转载请注明出处