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)
	}
}
相关推荐
你怎么知道我是队长6 小时前
C语言---枚举变量
c语言·开发语言
李慕婉学姐6 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
吃茄子的猫6 小时前
quecpython中&的具体含义和使用场景
开发语言·python
云栖梦泽6 小时前
易语言中小微企业Windows桌面端IoT监控与控制
开发语言
数据大魔方6 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
Edward.W8 小时前
Python uv:新一代Python包管理工具,彻底改变开发体验
开发语言·python·uv
小熊officer8 小时前
Python字符串
开发语言·数据库·python
武藤一雄8 小时前
C# 关于多线程如何实现需要注意的问题(持续更新)
windows·后端·microsoft·c#·.net·.netcore·死锁
月疯8 小时前
各种信号的模拟(ECG信号、质谱图、EEG信号),方便U-net训练
开发语言·python
荒诞硬汉8 小时前
JavaBean相关补充
java·开发语言