GO环境及入门案例

文章目录

  • 简介
  • [一、win GO开发环境安装](#一、win GO开发环境安装)
  • [二、Linux go运行环境](#二、Linux go运行环境)
  • 二、GO代码入门
    • [2.1 导包案例](#2.1 导包案例)
    • [2.2 赋值](#2.2 赋值)
    • [2.3 变量、函数](#2.3 变量、函数)
    • [2.4 三方库使用](#2.4 三方库使用)

简介

go不是面向对象语言, 其指针、结构体等比较像C,知名的go 开源项目有docker k8s prometheus node-exporter等

一、win GO开发环境安装

这里直接基于IDEA 安装一个GO插件即可

新建项目选择GO,本地如果没有安装GO SDK,可以直接从下面页面选择GO版本,IDEA会自动安装

GO hello world测试与go命令行测试

二、Linux go运行环境

sh 复制代码
curl -s https://mirror.go-repo.io/centos/go-repo.repo | tee /etc/yum.repos.d/go-repo.repo
yum install go

IDE 配置原创运行环境

go 编译出来得可执行文件包含运行环境,故包比较大,但运行比较方便。这里编译成.exe文件能在Linux运行也是因为它包含了运行环境,但是这样很奇怪,一般.exe是win程序,故最后还是勾选使用Linux环境进行编译。

运行可能报错编译出来得文件无执行权限,可以chmod +x 增加权限,这个问题可能是IDEA go插件问题,它编译时会编译出两个一样得可执行文件,其中一个没权限,运行时刚好跑了无权限那个。可以考虑专业GO IDEgoland

二、GO代码入门

走一遍这个教程也就差不多了解了

2.1 导包案例

go 复制代码
package main

import "fmt"
import "untitled2/xx"

func main() {
	fmt.Printf("%s-%d\n", "mystring", 123)
	println(xx.Add(1, 2))
	println(xx.Sub(1, 2))
}

2.2 赋值

go 复制代码
package main

var a = int8(127)
// ":="只能在声明"局部变量"的时候使用,而"var"没有这个限制
func main() {
	var b = int8(126)
	c :=int8(125)
	println(a,b,c)
}

2.3 变量、函数

go 复制代码
//  类型在变量名后 可省略
var bb bool = false
var cc = false

// 返回值类型在入参后,不可省略
func concatAll(a int, b int, c string) string {
	all := fmt.Sprintf("%d%d", a, b) + c
	return all
}

2.4 三方库使用

代理等环境变量设置

sh 复制代码
go env -w  GO111MODULE=on
go env -w   GOPROXY=https://mirrors.aliyun.com/goproxy/
go get k8s.io/client-go@latest

测试拉取第三方库,安装成功后可在go.mod文件看到(go.mod是go的包管理器)

sh 复制代码
go get k8s.io/client-go@latest

测试官方案例

go 复制代码
/*
Copyright 2016 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

// Note: the example only works with the code within the same release/branch.
package main

import (
	"context"
	"flag"
	"fmt"
	"path/filepath"
	"time"

	"k8s.io/apimachinery/pkg/api/errors"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/util/homedir"
	//
	// Uncomment to load all auth plugins
	// _ "k8s.io/client-go/plugin/pkg/client/auth"
	//
	// Or uncomment to load specific auth plugins
	// _ "k8s.io/client-go/plugin/pkg/client/auth/azure"
	// _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
	// _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"
)

func main() {
	var kubeconfig *string
	if home := homedir.HomeDir(); home != "" {
		kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
	} else {
		kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
	}
	flag.Parse()

	// use the current context in kubeconfig
	config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
	if err != nil {
		panic(err.Error())
	}

	// create the clientset
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err.Error())
	}
	for {
		pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
		if err != nil {
			panic(err.Error())
		}
		fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))

		// Examples for error handling:
		// - Use helper functions like e.g. errors.IsNotFound()
		// - And/or cast to StatusError and use its properties like e.g. ErrStatus.Message
		namespace := "default"
		pod := "example-xxxxx"
		_, err = clientset.CoreV1().Pods(namespace).Get(context.TODO(), pod, metav1.GetOptions{})
		if errors.IsNotFound(err) {
			fmt.Printf("Pod %s in namespace %s not found\n", pod, namespace)
		} else if statusError, isStatus := err.(*errors.StatusError); isStatus {
			fmt.Printf("Error getting pod %s in namespace %s: %v\n",
				pod, namespace, statusError.ErrStatus.Message)
		} else if err != nil {
			panic(err.Error())
		} else {
			fmt.Printf("Found pod %s in namespace %s\n", pod, namespace)
		}

		time.Sleep(10 * time.Second)
	}
}
相关推荐
Joy T2 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
专注仿真5 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
Best-Wishes5 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
代码不停6 小时前
自动化测试(java)
java·开发语言·selenium·自动化
行百里er6 小时前
Redis 完结篇——Redis 热点问题在 Spring Boot 项目中实战
redis·后端
高频因子挖掘机7 小时前
只取最近 60 个交易日,却每次拉全历史:量化脚本变慢的原因与改法
后端·github·api
鬼手点金8 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
爱上网的小舟8 小时前
星际战士2启动错误怎么办?5种游戏报错解决方法
开发语言·php
孟健8 小时前
从5000亿Token到83%字节匹配:AI逆向工程与重构的工程闭环实践
后端·架构·ai编程
阿里嘎多学长9 小时前
2026-10-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管