Golang中如何将变量分组命名?

Golang中如何将变量分组命名? 我想在代码中创建一些常量数据,这些数据可以从其他 .go 文件中访问。

decl.go

package declarations

type keydata struct {
    bufkeyvalue       uint8
    bufforeignvalue   uint8
}

我的问题是如何给 bufkeyvaluebufforeignvalue 赋值? 我尝试使用 const() 来做同样的事情,但当我尝试像下面这样给一个名称时:

const keydata (
    bufkeyvalue = 05
    bufforeignvalue = 0A
)

我遇到了错误。

下面的写法不会报错:

const (
    bufkeyvalue = 05
    bufforeignvalue = 0A
)

但我希望将 bufkeyvaluebufforeignvalue 分组在一个父名称下。

这些声明还有改进的空间吗? 谢谢。


更多关于Golang中如何将变量分组命名?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

我会把这段代码加入我的程序中,然后向你反馈更新。非常感谢。

更多关于Golang中如何将变量分组命名?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你不能像那样对常量进行分组。只需使用清晰的名称,或许可以加上前缀或后缀,例如:

KeyDataBufKeyValue = 0x5
KeyDataBufForeignValue = 0xA

忘记检查了。我一直在学习Go教程,虽然他们说“map”可以接受任何数据类型,但没有提到十六进制。

例如

var n = map[string] hex { }

我看到很多使用int/float32的例子,但没有提到十六进制。

你的意思是想要存储 fmt.Printf 打印的字符串吗?如果是这样,你可以使用 fmt.Sprintf,它会将值作为字符串返回,而不是打印到标准输出:

hexString := fmt.Sprintf("%X", baseValues["DefaultA"])

感谢。是的,我希望其他包能够访问这些变量(DefaultA…C),其默认值是在映射内部定义的。我尝试了您发送的命令,并且成功获取到了实际值。

               hexString := fmt.Sprintf("%X\n", baseValues["DefaultA"])
                    fmt.Println(hexString)

10300010002

amelia:

有没有一种直接的方法可以将16字节的十六进制值存储到变量中,并在不转换的情况下将相同的十六进制值传递给另一个变量?

你好 @amelia 所有数据都仅以二进制格式存储在变量中。编译器理解十进制、八进制和十六进制的立即值,并将它们转换为二进制。以何种表示形式显示它们,这已经是你的任务了。

我认为这就是 @nezabudka 所提到的:“十六进制”不是一种数据类型;它是一种表示数据的符号。数字 4275878552 可以用十六进制表示为 fedcba98,也可以用二进制表示为 11111110110111001011101010011000,但它们都是相同的数据类型;区别仅在于你如何展示数据。

我无意吹毛求疵。我只是提一下,看看这是否真的是你想要的 ¯_(ツ)_/¯

如果你想将 int64 的十六进制表示形式存储为字符串,那么你可以这样做:

func hexInt64(i int64) string {
    return fmt.Sprintf("%X", i)}
}

var n = map[string]string{
    "DefaultA": hexInt64(0x0000010300010002),
    "DefaultB": hexInt64(0x0000010300020002),
    "DefaultC": hexInt64(11),
}

// 我声明的大多数变量都应该被导出。因此这些变量都是大写的。 // 这是必须分配给已声明变量的默认值。

import (
 "encoding/hex"
 "fmt"
)

var baseValues = map[string] int64 {    
    "DefaultA" :      0x0000010300010002,
    "DefaultB" :      0x0000010300020002,
    "DefaultC"  :     11,
}

当我打印这些值时,我得到以下输出:

Map Values : map[DefaultA:138781130753 DefaultB:2220498157569 DefaultC:11]

我查阅了 golang.org 上的一些示例,其中提到了解码器/编码器。

我使用了 fmt.Printf("%X",baseValues[“DefaultA”]),得到的输出是 10300010002。

我的问题是:“是否有任何直接的方法可以将 16 字节的十六进制值存储到一个变量中,并在不进行转换的情况下将相同的十六进制值传递给另一个变量?谢谢。”

首先,尝试创建一个不使用常量的可运行程序。这是为了理解以大写字母开头的名称导出原则。示例: decl/decl.go:

package decl

type Keydata struct {
	Bufkeyvalue uint8
	Bufforeignvalue uint8
}

main.go:

package main

import (
    "fmt"
	"./decl"
)

func main() {
	//var k = decl.Keydata{Bufkeyvalue: 0x5, Bufforeignvalue: 0xA}
	k := decl.Keydata{0x5, 0xA}
	fmt.Println(k.Bufkeyvalue, k.Bufforeignvalue)
}

如果我没记错的话,Go语言不支持结构体中的常量。 你可能需要在程序中考虑其他数据类型, 但为了好玩,你可以应用这个变通方法。 decl/decl.go:

package decl

type keydata struct {
	bufkeyvalue uint8
	bufforeignvalue uint8
}

func ConstKeydata() keydata {
	return keydata{0x5, 0xA}
}

main.go:

package main

import (
    "fmt"
	"./decl"
	"reflect"
)

func main() {
	k := decl.ConstKeydata()
	val := reflect.ValueOf(&k)
	fmt.Println(val.Elem().FieldByName("bufkeyvalue"),
		val.Elem().FieldByName("bufforeignvalue"))
}

抱歉,我的法语不好。

在Go语言中,你可以使用以下几种方式将常量分组命名:

方法1:使用结构体常量(推荐)

package declarations

type KeyData struct {
    BufKeyValue      uint8
    BufForeignValue  uint8
}

var Constants = KeyData{
    BufKeyValue:     0x05,
    BufForeignValue: 0x0A,
}

在其他文件中使用:

package main

import (
    "fmt"
    "yourmodule/declarations"
)

func main() {
    fmt.Println(declarations.Constants.BufKeyValue)      // 输出: 5
    fmt.Println(declarations.Constants.BufForeignValue)  // 输出: 10
}

方法2:使用iota枚举(适用于相关常量)

package declarations

const (
    BufKeyValue uint8 = iota + 5  // 5
    BufForeignValue               // 6
)

方法3:使用常量块和前缀命名

package declarations

const (
    KeyDataBufKeyValue     uint8 = 0x05
    KeyDataBufForeignValue uint8 = 0x0A
)

方法4:使用函数返回分组常量

package declarations

func KeyData() struct {
    BufKeyValue, BufForeignValue uint8
} {
    return struct {
        BufKeyValue, BufForeignValue uint8
    }{
        BufKeyValue:     0x05,
        BufForeignValue: 0x0A,
    }
}

方法5:使用包级变量和init函数

package declarations

var (
    BufKeyValue     uint8
    BufForeignValue uint8
)

func init() {
    BufKeyValue = 0x05
    BufForeignValue = 0x0A
}

对于你的具体需求,方法1(结构体常量)是最清晰且符合Go习惯的方式,它提供了良好的命名空间分组,同时保持了类型安全和可访问性。

回到顶部