reflect.CanSet() Function in Golang with Examples
Go language provides inbuilt support implementation of run-time reflection and allowing a program to manipulate objects with arbitrary types with the help of reflect package. The reflect.CanSet() Function in Golang is used to check whether the value of v can be changed. To access this function, one needs to imports the reflect package in the program.
Syntax:
func (v Value) CanSet() bool
Parameters: This function does not accept any parameters.
Return Value: This function returns the boolean value.
Below examples illustrate the use of above method in Golang:
Example 1:
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))
fmt.Println(fieldValue.CanSet())
if fieldValue.CanSet(){
fieldValue.SetString(fieldValue.String())
}
}
}
func main() {
source := ProductionInfo{}
source.StructA = append(source.StructA, Entry{Field1: "A" , Field2: 2})
SetField(source, "Field1" , "NEW_VALUE" )
}
|
Output:
false
Example 2:
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()
fmt.Println(v.FieldByName(fieldName).CanSet())
if v.FieldByName(fieldName).CanSet() {
v.FieldByName(fieldName).SetString(fieldValue)
}
}
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])
}
|
Output:
Before: {A 2}
true
After: {NEW_VALUE 2}
Last Updated :
03 May, 2020
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...