41 lines
1.8 KiB
Markdown
41 lines
1.8 KiB
Markdown
# Background
|
|
|
|
In general, Kubernetes has not restricted using new Go features. We've quickly
|
|
adopted new standard library types and methods and will continue to do so.
|
|
|
|
Generally the latest stable Go release is in use on the main development branch.
|
|
This includes all of the staging libraries (client-go etc.) that originate in the
|
|
main [kubernetes/kubernetes](https://github.com/kubernetes/kubernetes) repository.
|
|
|
|
In Kubernetes v1.24 we shipped Go 1.18 (which adds support for generics)
|
|
rather late in the release cycle, so we temporarily prohibited using generics
|
|
in case we ran into other issues and needed to roll back to unblock the release.
|
|
Now that v1.24.0 is out, use of generics should be allowed.
|
|
|
|
# Generics Policy
|
|
|
|
Generics may be used in Kubernetes starting in v1.24, with the following restrictions
|
|
applying only until v1.23 is [out of support][version-support]:
|
|
|
|
- Generics should **not** be used in Kubernetes libraries used across multiple Kubernetes
|
|
versions, that is the non "staged" libraries like:
|
|
- [k8s.io/utils](https://github.com/kubernetes/utils)
|
|
- [sigs.k8s.io/yaml](https://github.com/kubernetes-sigs/yaml)
|
|
- [k8s.io/klog](https://github.com/kubernetes/klog)
|
|
- etc.
|
|
|
|
- Generics should be **avoided** when writing Kubernetes bug fixes that are
|
|
likely to be backported to v1.23 or older, to streamline cherry-picking to
|
|
those release branches which predate Go 1.18.
|
|
|
|
These restrictions should be considered lifted when v1.23 is out of support.
|
|
|
|
## Recommendations for Reviewers
|
|
|
|
- Consider if proposed generics pull requests improve maintainability and readability.
|
|
|
|
- The current generics implementation is known to have some performance issues
|
|
depending on usage: consider requesting benchmarks before / after the changes.
|
|
|
|
[version-support]: https://kubernetes.io/releases/patch-releases/#support-period
|