百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Go 我的第一个Go

toyiye 2024-06-21 11:59 11 浏览 0 评论

就是想打印我环境中的namespace

package main

import (
    "fmt"
    "os"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
    "context"
    // "metav1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/tools/clientcmd"
)


func main() {
    // Get the value of the `KUBECONFIG` environment variable.
    // kubeconfig := os.Getenv("KUBECONFIG")
    // 从环境变量或kubeconfig文件中获取Kubernetes配置
    config, err := rest.InClusterConfig()
    if err != nil {
        // 如果不在K8S集群内,可以使用kubeconfig文件来配置
        kubeconfig := os.Getenv("HOME") + "/.kube/config" // 修改为您的kubeconfig文件路径
        config, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
        if err != nil {
            panic(err.Error())
        }
    }

    // 创建一个Kubernetes客户端集
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }

    // 获取所有的Namespace
    namespaces, err := clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        panic(err.Error())
    }

    // 打印所有的Namespace名称
    for _, ns := range namespaces.Items {
        fmt.Println(ns.Name)
    }
}

反正是学习么?AI详细解释下

您的Go程序是一个用于获取并列出 Kubernetes 集群中所有 Namespace 的示例。

下面是对每一行代码的详细解释:

```go
package main
```

这一行定义了一个Go程序的包名,通常是`main`,表示这是一个可执行程序的入口。

```go
import (
"fmt"
"os"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"context"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/tools/clientcmd"
)
```

这里使用了`import`关键字来导入所需的Go包。这些包包括`fmt`用于格式化输出、`os`用于访问操作系统环境变量,以及一些用于与 Kubernetes 集群交互的包,如`k8s.io/client-go/kubernetes`和`k8s.io/client-go/rest`等。这些包是您在程序中使用的依赖项。

```go
func main() {
```

这一行开始了`main`函数的定义,这是每个Go程序的入口点。

```go
config, err := rest.InClusterConfig()
if err != nil {
```

这里使用`rest.InClusterConfig()`函数尝试从 Kubernetes 集群的内部配置中获取`config`对象,这个对象包含了与集群通信所需的信息。如果出现错误(例如,如果程序不在 Kubernetes 集群内),则会将`err`变量设置为非零值。

```go
kubeconfig := os.Getenv("HOME") + "/.kube/config"
```

如果无法获取内部配置,程序尝试从环境变量或者默认的 kubeconfig 文件路径中获取 Kubernetes 的配置文件路径。`os.Getenv("HOME")`获取了当前用户的主目录路径,然后将其与 kubeconfig 文件名拼接在一起,形成完整的 kubeconfig 文件路径。

```go
config, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
panic(err.Error())
}
}
```

如果从环境变量或默认路径中获取 kubeconfig 文件成功,程序使用`clientcmd.BuildConfigFromFlags()`函数从文件中创建一个配置对象(`config`)。如果出现错误,则程序会以恐慌(panic)的方式终止,并输出错误信息。

```go
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
```

在上述代码中,程序使用配置对象创建了一个 Kubernetes 客户端集(`clientset`)。这个客户端集允许您与 Kubernetes 集群进行交互。如果创建客户端集时出现错误,程序会以恐慌的方式终止。

```go
namespaces, err := clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err.Error())
}
```

这部分代码使用客户端集访问 Kubernetes 的 API,具体来说,它获取了所有的 Namespace 列表。如果出现错误,程序会以恐慌的方式终止。

```go
for _, ns := range namespaces.Items {
fmt.Println(ns.Name)
}
```

最后,程序迭代遍历获取的 Namespace 列表,并使用`fmt.Println`函数将每个 Namespace 的名称打印到标准输出。它的主要功能是连接到 Kubernetes 集群,获取 Namespace 列表,并将它们打印出来。

最简单直接的对比,就是执行速度和CPU消耗.

例如Go

time ./ns
kube-system
kube-public
kube-node-lease
kubernetes-dashboard
default
kong
cert-manager
./ns  0.02s user 0.01s system 10% cpu 0.307 total

命令行

time kubectl get ns
NAME                   STATUS   AGE
kube-system            Active   468d
kube-public            Active   468d
kube-node-lease        Active   468d
kubernetes-dashboard   Active   468d
default                Active   468d
kong                   Active   213d
cert-manager           Active   213d
kubectl get ns  0.07s user 0.03s system 105% cpu 0.095 total

那么可能会问?为什么选择Go

通过 Go 的方式实现的命令行程序通常比直接使用命令行要快。这是因为 Go 语言是编译型的语言,而命令行是解释型的语言。编译型的语言在编译时会将代码转换成机器码,而解释型的语言在运行时会将代码转换成机器码。因此,编译型的语言通常比解释型的语言要快。

使用Go语言编写与直接使用命令行工具(例如kubectl)相比,有一些明显的优势和用例,尤其是在开发自动化工具和处理复杂任务时。下面是一些使用Go语言的优势:

1. **性能和并发性**:Go语言以其出色的性能和并发支持而闻名。Go的并发模型(goroutines和channels)使得编写高效且并行处理任务的代码变得容易。这在处理大规模数据或需要同时处理多个任务的情况下非常有用。

2. **跨平台性**:Go语言是一种跨平台的语言,可以轻松编译为多个操作系统和体系结构。这意味着您可以编写一次代码,然后在不同的操作系统上运行,而不需要做太多修改。

3. **静态编译**:Go语言的编译器会生成静态可执行文件,这意味着您可以轻松地将应用程序部署到目标系统,而无需依赖运行时环境。这降低了部署的复杂性。

4. **强大的标准库**:Go语言拥有一个强大而丰富的标准库,包括用于处理文件、网络、并发、JSON等的包。这使得编写各种类型的应用程序变得更加容易。

5. **容易构建CLI工具**:Go语言的标准库中包括用于构建命令行界面(CLI)工具的包,例如`flag`和`cobra`。这使得编写自定义CLI工具以执行各种任务变得非常简单。

6. **易于维护**:Go语言的语法相对简单,代码风格一致性强,这有助于更容易阅读和维护代码。这对于长期项目和团队合作非常重要。

7. **社区支持**:Go语言拥有一个活跃的开发社区,提供大量的开源库和工具,可以加速开发过程。此外,有许多在线资源和文档可供学习和参考。

8. **安全性**:Go语言在内存管理方面有很多内置的安全性功能,有助于减少许多常见的安全漏洞,如缓冲区溢出。

总的来说,Go语言适用于编写高性能、高并发、跨平台的应用程序,特别适合用于构建工具、自动化任务以及需要与外部系统(如Kubernetes)进行交互的应用程序。当需要更多控制、性能和定制化时,使用Go语言可能比直接使用命令行工具更有优势。但是,选择使用哪种方法还取决于具体的项目需求和您的熟练程度,有时使用kubectl等命令行工具也可以更快速地实现简单的任务。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码