El lenguaje Go proporciona una implementación de soporte incorporada de la reflexión en tiempo de ejecución y permite que un programa manipule objetos con tipos arbitrarios con la ayuda del paquete de reflexión. La función reflect.CanSet() en Golang se usa para verificar si el valor de v se puede cambiar. Para acceder a esta función, es necesario importar el paquete reflect en el programa.
Sintaxis:
func (v Value) CanSet() boolParámetros: Esta función no acepta ningún parámetro.
Valor devuelto: esta función devuelve el valor booleano.
Los siguientes ejemplos ilustran el uso del método anterior en Golang:
Ejemplo 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") }
Producción:
false
Ejemplo 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]) }
Producción:
Before: {A 2} true After: {NEW_VALUE 2}
Publicación traducida automáticamente
Artículo escrito por SHUBHAMSINGH10 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA