"Go setPointerFieldToNil()"의 두 판 사이의 차이

 
(같은 사용자의 중간 판 5개는 보이지 않습니다)
1번째 줄: 1번째 줄:
==개요==
==개요==
;Go setPointerFieldToNil()
;Go setPointerFieldToNil() 구현
;Go 구조체 포인터 필드에 nil 값 설정


<syntaxhighlight lang='go' run>
<syntaxhighlight lang='go' run>
15번째 줄: 16번째 줄:
}
}


func setPointerFieldToNil(obj interface{}) {
func setPointerFieldToNil(o interface{}) {
v := reflect.ValueOf(obj).Elem()
el := reflect.ValueOf(o).Elem()
for i := 0; i < v.NumField(); i++ {
for i := 0; i < el.NumField(); i++ {
f := v.Field(i)
f := el.Field(i)
if f.Kind() == reflect.Ptr {
if f.Kind() == reflect.Ptr {
f.Set(reflect.Zero(f.Type()))
f.Set(reflect.Zero(f.Type()))
48번째 줄: 49번째 줄:
type Response struct {
type Response struct {
Status string
Status string
Data  Person
Data1  Person
Data2  *Person
}
}


func setPointerFieldToNil(obj interface{}) {
func setPointerFieldToNil(o interface{}) {
v := reflect.ValueOf(obj).Elem()
el := reflect.ValueOf(o).Elem()
for i := 0; i < v.NumField(); i++ {
for i := 0; i < el.NumField(); i++ {
f := v.Field(i)
f := el.Field(i)
if f.Kind() == reflect.Ptr {
switch f.Kind() {
case reflect.Ptr:
f.Set(reflect.Zero(f.Type()))
f.Set(reflect.Zero(f.Type()))
case reflect.Struct:
setPointerFieldToNil(f.Addr().Interface())
}
}
}
}
63번째 줄: 68번째 줄:
func main() {
func main() {
name1 := "John"
name1 := "John"
r1 := Response{Status: "success", Data: Person{11, &name1}}
person1 := Person{11, &name1}
fmt.Printf("%+v\n", r1) // {Status:success Data:{Age:11 Name:0xc000014070}}
r1 := Response{Status: "success", Data1: person1, Data2: &person1}
fmt.Printf("%#v\n", r1)
setPointerFieldToNil(&r1)
setPointerFieldToNil(&r1)
fmt.Printf("%+v\n", r1) // {Status:success Data:{Age:11 Name:0xc000014070}}
fmt.Printf("%#v\n", r1)
}
}
</syntaxhighlight>
</syntaxhighlight>
78번째 줄: 84번째 줄:
[[분류: Go 구조체]]
[[분류: Go 구조체]]
[[분류: Go reflect 패키지]]
[[분류: Go reflect 패키지]]
[[분류: Go nil]]

2023년 10월 18일 (수) 21:30 기준 최신판

1 개요[ | ]

Go setPointerFieldToNil() 구현
Go 구조체 포인터 필드에 nil 값 설정
package main

import (
	"fmt"
	"reflect"
)

type Person struct {
	Age  int
	Name *string
}

func setPointerFieldToNil(o interface{}) {
	el := reflect.ValueOf(o).Elem()
	for i := 0; i < el.NumField(); i++ {
		f := el.Field(i)
		if f.Kind() == reflect.Ptr {
			f.Set(reflect.Zero(f.Type()))
		}
	}
}

func main() {
	name1 := "John"
	p1 := Person{11, &name1}
	fmt.Printf("%+v\n", p1) // {Age:11 Name:0xc000104020}
	setPointerFieldToNil(&p1)
	fmt.Printf("%+v\n", p1) // {Age:11 Name:<nil>}
}
package main

import (
	"fmt"
	"reflect"
)

type Person struct {
	Age  int
	Name *string
}

type Response struct {
	Status string
	Data1  Person
	Data2  *Person
}

func setPointerFieldToNil(o interface{}) {
	el := reflect.ValueOf(o).Elem()
	for i := 0; i < el.NumField(); i++ {
		f := el.Field(i)
		switch f.Kind() {
		case reflect.Ptr:
			f.Set(reflect.Zero(f.Type()))
		case reflect.Struct:
			setPointerFieldToNil(f.Addr().Interface())
		}
	}
}

func main() {
	name1 := "John"
	person1 := Person{11, &name1}
	r1 := Response{Status: "success", Data1: person1, Data2: &person1}
	fmt.Printf("%#v\n", r1)
	setPointerFieldToNil(&r1)
	fmt.Printf("%#v\n", r1)
}

2 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}