数组声明与遍历

数组声明

subsCodes := []string{"aaaa", "vvvvv", "dddd", "eeeee", "gfgggg"}

数组遍历

for i,subsCodesi := range subsCodeList {
	fmt.Println(subsCodeList[i])
	fmt.Println(subsCodesi)
}

数组len

len(subsCodeList)
判断
if versionInfo.Retcode != 0 || len(versionInfo.Data) == 0 {

}
字符串

拼接

local_package := local_path+"/"+appIdStr+".tgz"
msg=fmt.Sprintf("app=%v appi=%v :获取失败", appId, appiId)

错误输出

errors.New(fmt.Sprintf("job_name=%v 任务创建失败", jobName))
errors.Error()
log.Error(err.Error())

字符串–>split–字符串数组

settings := strings.Split(setting, ",")
if len(settings) != 7 {
	return -1, errors.New("设置参数错误!")
}

转换
字符串转数字

poolSizeInt, _ := strconv.Atoi(poolSizeStr)

数字转字符串

poolSizeStr := strconv.Itoa(poolSizeInt)

interface转字符串参考文章:[golang]-interface转string
字符大小写转换
将下划线转为驼峰

//将下划线转为驼峰
func Case2Camel (appConfigFileName string) string {
	flag := 0
	buffer := NewBuffer()
    for _, r := range appConfigFileName {
        if r == '_' {
			flag = 1
        } else {
			if flag == 1 {
				buffer.Append(unicode.ToUpper(r))
				flag = 0
			}else{
				buffer.Append(r)
			}
        }
    }
	return buffer.String()
}

string与byte:golang string和[]byte的对比
参考文章:Go语言遍历字符串——获取每一个字符串元素
正则匹配所有符合字符串

proname_line := "https://xx/jenkins/view/all/job/frontModelDev/job/charts/build?delay=0sec" 
r := regexp.MustCompile(`job/(.+?)/`) 
matches := r.FindAllStringSubmatch(proname_line, -1)
for _, v := range matches {
	fmt.Println(v[1])
}
结构体

结构体初始化与追加

subProi := SubPro_info{
    SubPro_name: appname,
    SubPro_ver: appversion,
    SubPro_cpu: appconfigi.Spec.CPU,
    SubPro_mem: appconfigi.Spec.Mem,
}
subProList= append(subProList, subProi)

空接口

interface{}
导入本地包

go.mod

module test6 //模块名

go 1.14  //go sdk版本

mypackage/mypackage.go

package mypackage //package 后面跟上一级目录

import "fmt"

func New(){
	fmt.Println("mypackage.New")
}

main.go

package main

import (
	"fmt"
	"test6/mypackage"  //导入同一项目下的mypackage包
	"test6/mypackage/aaa" //根与go mod模块名相同
)
func main() {
	mypackage.New()
	aaa.Newaaa()
	fmt.Println("main")
}

导包报错:package test8/global is not in GOROOT (E:\software\360scanner\GO\package\src\test8\global)
因为本地根本没找到包,所以go从GOROOT去找–>你的包路径写错了
应该为:test8/pkg/global
在这里插入图片描述

时间比较
newest_time := "2006-01-02 15:04:05"
//先把时间字符串格式化成相同的时间类型
newest_timei, err := time.Parse("2006-01-02 15:04:05", newest_time)
pack_timei, err := time.Parse("2006-01-02 15:04:05", pack_time)
if err == nil && pack_timei.After(newest_timei) {
	newest_timei = pack_timei
	versionDL = version_id

模块复用

当你写一段代码经常copy了其他地方的代码,你就可以把他提出来,比如说post,get请求,字符串首尾去空白符。
一段代码重复出现在一个方法里,你可以写个循环

listFliter := map[int]string{
   1:	clusterListOrg,
   2:	nodeListOrg,
}

for num, listOrg := range listFliter {
	.......
}

适用性、普遍性

把能提出来的都提出来,不把东西写死,你看有些人写的代码,其实写的很好,但就是很死,这样用一次就容易被丢弃,你回头还要重做。

输入格式提示 交互

总输入格式提示

fmt.Println(` 
      Enter following commands to control the player: 
      lib list -- View the existing music lib 
   	  lib add <name><artist><source><type> -- Add a music to the music lib 
      lib remove <name> -- Remove the specified music from the lib 
      play <name> -- Play the specified music
`)

输入错误提示

if len(tokens) == 6 {
	lib.Add(&library.Music{strconv.Itoa(id),tokens[2],tokens[3],tokens[4],tokens[5]})
}else{
	fmt.Println("USAGE:lib add <name><artist><source><type>")
}
命令行输入命令 交互

强格式匹配输入

var infile *string = flag.String("i", "infile", "File contains values for sorting") 
var outfile *string = flag.String("o", "outfile", "File to receive sorted values") 
var algorithm *string = flag.String("a", "qsort", "Sort algorithm") 
func main() { 
	flag.Parse() 
	if infile != nil { 
		fmt.Println("infile =", *infile, "outfile =", *outfile, "algorithm =", *algorithm) 
	}
} 

弱格式匹配输入

r := bufio.NewReader(os.Stdin)
for {
   fmt.Println("Enter command ->")
   readline,_,_ := r.ReadLine()
   line := string(readline)
   if (line == "q") || (line == "e") {
      break
   }
   tokens := strings.Split(line," ")
   if tokens[0] == "lib" {
      handleLibCommands(tokens)
   }else if tokens[0] == "play" {
      handlePlayCommand(tokens)
   }else{
      fmt.Println("unrecognized command:",tokens[0])
   }
}
老用的方法

map通过key访问value

captial, ok := countryCapitalMap["United States"]
if(ok){
       fmt.Println("Capital of United States is", captial)
}

将字符串转化为map

s := "k1=v1; k2=v2; k3=v3"
entries := strings.Split(s, "; ")
m := make(map[string]string)
for _, e := range entries {
   parts := strings.Split(e, "=")
   m[parts[0]] = parts[1]
}
fmt.Println(m)

判断文件或文件夹是否存在?

_, err := os.Stat(path)
如果返回的错误为nil,说明文件或文件夹存在
参考文章:golang判断文件或文件夹是否存在

Go输出双引号?

str2 := `"www.hewe.vip"`
Go安装与问题解决

go sdk问题

go下载sdk:go SDK下载及环境变量配置
在这里插入图片描述
报错:构建go项目时,包io/fs不在GOROOT中
升级go sdk,参考文章:构建go项目时,包io/fs不在GOROOT中

你修改了go的sdk里面的内容
在这里插入图片描述
报错:…\GO\package\src\encoding\json\decode.go:1:1: expected ‘package’, fou。。。。。。
我想过从其他go的src里面去copy,替换自己的的go的src已修改的文件。我试过,不行,会因为sdk版本不同,出现不兼容。
所以还是老老实实把自己本地sdk删除,下一个sdk,解压,其他东西不要变,因为你之前设置过。如goroot,gopath
下载地址:https://studygolang.com/dl
参考文章:[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
在这里插入图片描述
然后自己跑一个demo,不要点直接运行,要go build,go run就ok了
为了避免出现问题,以后不要动sdk里面的东西。

报错:cmd/link: “x86_64-w64-mingw32/bin/ld.exe: Error: export ordinal too large”
当初我的go sdk为1.15,github上说go sdk为1.14可以,结果确实可以。

go mod问题

go清除依赖:go mod tidy
go添加依赖:go get xxxx

go mod 设置
在这里插入图片描述

warning: GOPATH set to GOROOT (E:\software\360scanner\GO\package) has no effect
查看go env
找到对的项目,把go env的结果输出,和错的工程对比
在这里插入图片描述
发现错的工程里的go path没有导入本工程路径。
set GOPATH=E:\software\360scanner\goland\projects\test;E:\software\360scanner\GO\package
就可以了

你修改了go的sdk里面的内容
在这里插入图片描述
报错:…\GO\package\src\encoding\json\decode.go:1:1: expected ‘package’, fou。。。。。。
我想过从其他go的src里面去copy,替换自己的的go的src已修改的文件。我试过,不行,会因为sdk版本不同,出现不兼容。
所以还是老老实实把自己本地sdk删除,下一个sdk,解压,其他东西不要变,因为你之前设置过。如goroot,gopath
下载地址:https://studygolang.com/dl
参考文章:[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
在这里插入图片描述
然后自己跑一个demo,不要点直接运行,要go build,go run就ok了
为了避免出现问题,以后不要动sdk里面的东西。

报错:cmd/link: “x86_64-w64-mingw32/bin/ld.exe: Error: export ordinal too large”
当初我的go sdk为1.15,github上说go sdk为1.14可以,结果确实可以。