4 回答
TA贡献1818条经验 获得超3个赞
我的猜测是这样做是为了确保配置标志的值在更改时随处更新。
这个例子可能有帮助
package main
import "fmt"
func stringPointer(s string) *string {
return &s
}
type Config struct {
String string
Pointer *string
}
func NewConfig() Config {
return Config{
String: "default",
Pointer: stringPointer("default"),
}
}
var (
config = NewConfig()
String = config.String
Pointer = config.Pointer
)
func PrintVars() {
fmt.Printf("config.String: %v\n", config.String)
fmt.Printf("config.Pointer: %v\n", *config.Pointer)
fmt.Printf("String: %v\n", String)
fmt.Printf("Pointer: %v\n", *Pointer)
fmt.Println("-------------------------")
}
func main() {
PrintVars()
config.String = "new value"
*config.Pointer = "new value"
PrintVars()
String = "even newer value"
*Pointer = "even newer value"
PrintVars()
}
出去:
config.String: default
config.Pointer: default
String: default
Pointer: default
-------------------------
config.String: new value
config.Pointer: new value
String: default
Pointer: new value
-------------------------
config.String: new value
config.Pointer: even newer value
String: even newer value
Pointer: even newer value
-------------------------
TA贡献1828条经验 获得超13个赞
通常,在配置中使用 int 指针而不是 int 的目的(如 kubernetes spec)是为了区分显式零和未指定,与 string 或 bool 相同。
TA贡献1866条经验 获得超5个赞
属性指针为属性提供另一个值:
type config struct { PtrValue *string Value string }
指向基本类型变量的指针非常适合空字符串("")
与值具有不同含义的情况nil
。
例如,命令行程序的输入参数不能保证用户提供了这样的输入。指针值是区分无输入和零值输入的理想方式。
TA贡献2036条经验 获得超8个赞
要存储一个字符串,您需要 2 个字的计算机内存。其中一个指向字符串的开头,另一个包含长度。
字符串指针只有一半大小,因为它只是一个指针,没有长度。这样可以节省内存。
当您有 100 个指向同一个字符串的指针时,这种差异就会变得很明显。然后你有 100 + 2 个单词加上实际的字节数组。这当然取决于是否newstring
实习字符串。
使用字符串指针而不是字符串还有另一个用例。然后程序可以区分空字符串和根本没有字符串。特别是在配置部分,这很有用。超时为 0 秒与根本没有超时是不同的。对于大多数其他配置选项,空字符串无论如何都没有意义,所以这只是开销。尽管如此,它仍以这种方式构建,以便每个配置选项都具有相同的结构。当您需要理解代码时,这种一致性会有所帮助。
也可能有其他原因。也许有一些关于这个主题的项目文档。
- 4 回答
- 0 关注
- 160 浏览
添加回答
举报