Golang Go语言中结构体套结构体指针--有什么黑魔法么

发布于 1周前 作者 phonegap100 来自 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

8 回复

其他包可以创建 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 := &amp;Config{}<br><br>b:=a.Complete()<br><br>如果 a 在某个地方被改了,b 不是也被改了<br><br>

在Golang中,结构体嵌套结构体指针是一种常见的编程模式,它带来了一些独特的优势和潜在的“黑魔法”。这里,我将简要介绍几个关键点:

  1. 内存效率:通过嵌套结构体指针,可以避免不必要的内存复制,特别是当结构体较大或嵌套层级较多时。这有助于减少内存占用并提高性能。

  2. 灵活性:使用指针允许你在运行时动态地改变嵌套结构体的值,而无需复制整个父结构体。这对于需要频繁更新数据的场景特别有用。

  3. 空值优化:如果嵌套的结构体在某些情况下可能不需要初始化,使用指针可以避免分配不必要的内存空间。只需将指针设为nil即可。

  4. JSON序列化和反序列化:在处理JSON数据时,嵌套结构体指针的行为可能与直接嵌套结构体不同。特别是,如果指针为nil,JSON字段可能会被省略,这有助于生成更紧凑的JSON输出。

  5. 循环引用:在复杂的数据结构中,使用指针可以避免循环引用导致的内存泄漏问题。但这也需要小心处理,以避免未解决的循环引用。

总的来说,结构体嵌套结构体指针在Golang中是一种强大的编程技巧,它提供了内存效率和灵活性的优势。然而,它也带来了额外的复杂性,特别是在处理JSON数据、内存管理和循环引用方面。因此,在使用时应谨慎考虑其带来的潜在影响。

回到顶部