Golang中如何通过键访问结构体的值
Golang中如何通过键访问结构体的值 我想通过键(整数)从结构体中获取对应的值(字符串)。有任何线索吗?我在JavaScript中写了一段代码,想在Go语言中实现类似的功能。
以下是JavaScript代码:
function resetCause(bits) {
var resetDictionary = {
'1': 'Watchdog Reset',
'2': 'Power On Reset',
'3': 'System Request Reset',
'4': 'Other Resets',
};
return resetDictionary[bits];
}
这里的bits是一个十进制值(基本上是1,2,3,4),我可以从代码的某部分传递这个值,然后获取对应的字符串值。
更多关于Golang中如何通过键访问结构体的值的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我也试过了。还是无法解决这个问题。
我能否使用结构体执行相同的操作?
谢谢。是什么导致了以下错误?
hemanth_naidu:
语法错误:意外的 main,应为 (
请发布完整的代码。看起来是另一个问题… 你也可以在 Go 语言 playground 上创建你的版本并给我们链接…
hemanth_naidu:
是什么导致了此错误?
你在以下代码行后缺少一个闭合括号 }:
return value, ok
src 不是 GOPATH 的一部分,它必须位于该路径之下。
因此你需要设置 GOPATH=C:\Go\go-work 而不是 GOPATH=C:\Go\go-work\src。
hemanth_naidu:
C:\Go\go-work\src\src\github.com\smartmakers\drivers\go\driver
这种情况应该被视为错误路径,因为目录结构中不可能出现重复的 src 文件夹——请检查您的路径配置
如果向函数传递常量或变量作为参数,这是没有问题的。 这样可以正常工作:
func main() {
bits := 3
value, ok := resetCause(bits)
if ok {
fmt.Println("Value=", value)
}
}
我建议您将代码放在 C:\Go\go-work\src 目录下。
例如,如果您的项目名为 someproject,那么它应该位于路径
C:\Go\go-work\src\someproject 中,然后进行导入操作。
map 也是一种结构类型,但如果你想从 resetCause 返回结构体,就需要先定义结构体类型再返回
type MyStruct struct {
Field1 string
Field2 int
}
func resetCause() MyStruct {
return MyStruct{
Field1: "example",
Field2: 42,
}
}
这看起来像是一个映射表
func resetCause(bits int) (string, bool) {
resetMap := map[int]string{
1: "Watchdog Reset",
2: "Power On Reset",
3: "System Request Reset",
4: "Other Resets",
}
value, ok := resetMap[bits]
return value, ok
}
我在设置gopath时遇到了问题。即使在工作区设置为GOPATH内的子路径后,我仍然无法访问库文件。它抛出了这个错误:
c:\go\src\github.com\smartmakers\drivers\go\driver (来自 $GOROOT)
C:\Go\go-work\src\src\github.com\smartmakers\drivers\go\driver (来自 $GOPATH)
我是不是遗漏了什么?
是的,但是当我传递键时如何访问值。 例如,我想通过调用函数将值(字符串)放入一个新变量中。在 JavaScript 中:
var reason = resetCause(3)
console.log(reason)
它返回
"System Request Reset"
我尝试在 Go 中这样做:
func main() {
bits := 3
resetCause(bits)
}
它抛出错误
syntax error: unexpected main, expecting (
C:\Go\go-work>go env
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\userName\AppData\Local\go-build
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\Go\go-work
set GOPROXY=
set GORACE=
set GOROOT=c:\go
set GOTMPDIR=
set GOTOOLDIR=c:\go\pkg\tool\windows_amd64
set GCCGO=gccgo
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\userName\AppData\Local\Temp\go-build137919522=/tmp/go-build -gno-record-gcc-switches
在Go语言中,可以通过多种方式实现类似JavaScript中通过键访问结构体值的功能。以下是几种常见的方法:
方法1:使用map(最接近JavaScript的实现)
func resetCause(bits int) string {
resetDictionary := map[int]string{
1: "Watchdog Reset",
2: "Power On Reset",
3: "System Request Reset",
4: "Other Resets",
}
return resetDictionary[bits]
}
// 使用示例
func main() {
fmt.Println(resetCause(1)) // 输出: Watchdog Reset
fmt.Println(resetCause(3)) // 输出: System Request Reset
}
方法2:使用switch语句
func resetCause(bits int) string {
switch bits {
case 1:
return "Watchdog Reset"
case 2:
return "Power On Reset"
case 3:
return "System Request Reset"
case 4:
return "Other Resets"
default:
return ""
}
}
方法3:使用结构体和映射函数
type ResetType struct {
ID int
Name string
}
func getResetCause(bits int) string {
resetTypes := []ResetType{
{1, "Watchdog Reset"},
{2, "Power On Reset"},
{3, "System Request Reset"},
{4, "Other Resets"},
}
for _, reset := range resetTypes {
if reset.ID == bits {
return reset.Name
}
}
return ""
}
方法4:使用常量枚举
const (
WatchdogReset = iota + 1
PowerOnReset
SystemRequestReset
OtherResets
)
func resetCause(bits int) string {
resetMap := map[int]string{
WatchdogReset: "Watchdog Reset",
PowerOnReset: "Power On Reset",
SystemRequestReset: "System Request Reset",
OtherResets: "Other Resets",
}
return resetMap[bits]
}
对于你的具体需求,方法1使用map是最直接且最接近JavaScript实现的方案。它提供了与JavaScript对象类似的键值对访问方式,代码简洁且易于理解。


