Golang Go语言中结构体套结构体指针--有什么黑魔法么
Golang Go语言中结构体套结构体指针–有什么黑魔法么
在看 k8s 源代码时候,有这么一段代码,其中 Complete()方法, 看注释是可以填充没有设置的字段,填充字段需要这么套娃么.
CompletedConfig --》 指针 completedConfig --》 Config 指针
// Config is the main context object for the controller manager.
type Config struct {
ComponentConfig kubectrlmgrconfig.KubeControllerManagerConfiguration
SecureServing *apiserver.SecureServingInfo
// LoopbackClientConfig is a config for a privileged loopback connection
LoopbackClientConfig *restclient.Config
// TODO: remove deprecated insecure serving
InsecureServing *apiserver.DeprecatedInsecureServingInfo
Authentication apiserver.AuthenticationInfo
Authorization apiserver.AuthorizationInfo
// the general kube client
Client *clientset.Clientset
// the client only used for leader election
LeaderElectionClient *clientset.Clientset
// the rest config for the master
Kubeconfig *restclient.Config
// the event sink
EventRecorder record.EventRecorder
}
type completedConfig struct {
*Config
}
// CompletedConfig same as Config, just to swap private object.
type CompletedConfig struct {
// Embed a private pointer that cannot be instantiated outside of this package.
*completedConfig
}
// Complete fills in any fields not set that are required to have valid data. It’s mutating the receiver.
func (c *Config) Complete() *CompletedConfig {
cc := completedConfig{c}
apiserver.AuthorizeClientBearerToken(c.LoopbackClientConfig, &c.Authentication, &c.Authorization)
return &CompletedConfig{&cc}
}
更多关于Golang Go语言中结构体套结构体指针--有什么黑魔法么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
其他包可以创建 Config 对象,设置属性,然后通过 Complete 方法补全,得到一个隐藏全部细节的 CompletedConfig,不会有机会再改动属性,看上去是这个目的
更多关于Golang Go语言中结构体套结构体指针--有什么黑魔法么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
注释不是写的很清楚吗
only write once
它这个 comment 不如写成,Only allow write once access.
手机看代码真难受
恩,谢谢,注释写的模拟量可
如果原始的 Config 改变了,感觉防止不了 Config 被改
比如<br>a := &Config{}<br><br>b:=a.Complete()<br><br>如果 a 在某个地方被改了,b 不是也被改了<br><br>
在Golang中,结构体嵌套结构体指针是一种常见的编程模式,它带来了一些独特的优势和潜在的“黑魔法”。这里,我将简要介绍几个关键点:
-
内存效率:通过嵌套结构体指针,可以避免不必要的内存复制,特别是当结构体较大或嵌套层级较多时。这有助于减少内存占用并提高性能。
-
灵活性:使用指针允许你在运行时动态地改变嵌套结构体的值,而无需复制整个父结构体。这对于需要频繁更新数据的场景特别有用。
-
空值优化:如果嵌套的结构体在某些情况下可能不需要初始化,使用指针可以避免分配不必要的内存空间。只需将指针设为nil即可。
-
JSON序列化和反序列化:在处理JSON数据时,嵌套结构体指针的行为可能与直接嵌套结构体不同。特别是,如果指针为nil,JSON字段可能会被省略,这有助于生成更紧凑的JSON输出。
-
循环引用:在复杂的数据结构中,使用指针可以避免循环引用导致的内存泄漏问题。但这也需要小心处理,以避免未解决的循环引用。
总的来说,结构体嵌套结构体指针在Golang中是一种强大的编程技巧,它提供了内存效率和灵活性的优势。然而,它也带来了额外的复杂性,特别是在处理JSON数据、内存管理和循环引用方面。因此,在使用时应谨慎考虑其带来的潜在影响。