数组声明
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可以,结果确实可以。