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

21 回复

仍然出现相同的错误。

更多关于Golang中如何通过键访问结构体的值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我也试过了。还是无法解决这个问题。

我能否使用结构体执行相同的操作?

运行 go env 并将其发布在这里

// 代码部分保持原样

谢谢。是什么导致了以下错误?

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 (

我也检查并纠正了这个问题。现在在Atom中编译时一切正常,没有错误。但在命令行中执行代码的测试命令时,会抛出以下错误:

The system cannot find the file specified.

这是因为我在尝试导入某个必需的库,而这个库的命名系统存在问题。

github.com\smartmakers\drivers\go\driver

我当前的路径如下所示:

C:\Go\go-work\src\gobps

我也考虑过这一点。我想这是安装后的路径状态。

So you need to set GOPATH=C:\Go\go-work
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对象类似的键值对访问方式,代码简洁且易于理解。

回到顶部