pointers - 更改通过引用传递的结构的值
问题描述
我想传递一个结构作为对函数的引用,并根据它的类型,通过反射识别,进行适当的转换并将值存储在结构本身中。
但是,尽管代码运行,并且值在函数内部被识别和转换,但当控件返回到函数 main() 时,结构没有我希望存储在那里的值。
这是代码:
package main
import (
"fmt"
"reflect"
"strconv"
)
type x struct {
f1 string
f2 int
f3 bool
}
func main() {
s := x{}
getData(&s.f1, "AAA")
getData(&s.f2, "1")
getData(&s.f3, "true")
fmt.Println(s)
}
func getData(data interface{}, value string) {
if value != "" {
switch reflect.TypeOf(data).String() {
case "*int":
data, _ = strconv.Atoi(value)
case "*bool":
data, _ = strconv.ParseBool(value)
case "*string":
data = value
}
}
}
在这个例子中,我正在{ 0 false}
期待{ AAA 1 true}
有没有Golang GURU可以告诉我这段代码我做错了什么?
下面的链接去游乐场 https://play.golang.org/p/l1_INJLOhAq
解决方案
使用类型开关根据值的类型执行代码。在这种情况下不需要使用反射。
func getData(data interface{}, value string) {
if value != "" {
switch data := data.(type) {
case *int:
*data, _ = strconv.Atoi(value)
case *bool:
*data, _ = strconv.ParseBool(value)
case *string:
*data = value
}
}
}
有关类型开关的更多信息:Go Tour、Go Specification、Effective Go。
推荐阅读
- java - Netbeans 11.3 - 所有项目都坏了
- javascript - 什么是在数组中多次调用 AJAX api 的好方法?
- javascript - 在 Nodejs 中,为什么同步代码在异步之前执行?
- networking - 数据链路层最常用的错误控制机制是什么?
- node.js - 具有用户权限、客户端权限和限制的 Discord.js 命令处理程序
- facebook - 取消选择页面和组的 Facebook 登录对话框权限
- javascript - 在我的网站上谷歌登录后提示错误的范围
- spring-boot - 为什么我的 spring webflux 与 spring mvc 负载测试吞吐量相同?
- postgresql - 是否可以在官方 Postgres 二进制文件上安装 Citus 扩展?
- excel - 如何根据 MS Access VBA 代码中的昨天日期过滤表?