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)
	}
}
相关推荐
技术猿188702783513 分钟前
Spring Boot应用中的文件压缩与解压技术实践
java·spring boot·后端
JAMES费11 分钟前
python机器人Agent编程——多Agent框架的底层逻辑(上)
开发语言·python·机器人
JovaZou27 分钟前
[Python学习日记-67] 封装
开发语言·python·学习
hlsd#27 分钟前
go 集成swagger 在线接口文档
开发语言·后端·golang
Java Fans33 分钟前
深入探索R语言在机器学习中的应用与实践
开发语言·机器学习·r语言
草原上唱山歌39 分钟前
C++需要学习哪些内容?
开发语言·c++·学习
lly20240644 分钟前
SQLite Where 子句
开发语言
大脑经常闹风暴@小猿1 小时前
Django 启用国际化支持—实现配置多国语言
后端·python·django
Clrove.111 小时前
C++初阶——queue
开发语言·c++
计算机-秋大田1 小时前
基于微信小程序的在线疫苗预约的设计与实现,LW+源码+讲解
spring boot·后端·微信小程序·小程序·vue