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)
	}
}
相关推荐
考虑考虑3 小时前
数据库中的EXISTS
运维·数据库·后端
lsswear4 小时前
Python 并发 线程
开发语言·python
郑州光合科技余经理4 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼4 小时前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
软件课代表CiCi4 小时前
运行库是什么?电脑缺运行库怎么办?c++运行库缺失修复全攻略
开发语言·c++·windows·电脑·dll修复·dll丢失·运行库
Ivanqhz4 小时前
MLIR OpBuilder
开发语言·python·mlir
红宝村村长6 小时前
windows笔记本双系统ubuntu设置
开发语言
菜鸟~noob2337 小时前
【电子战】第15篇:混合定位——TDOA/FDOA/AOA 联合【含matlab代码】
开发语言·matlab
我不会起名字3227 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
苏三说技术8 小时前
为什么越来越多人用OpenWiki?
后端