首先今天vscode配置go语言开发环境的过程中犯了两个小错误。属于是搜查资料没有搜查全面。第一个就是出现无法编译go程序,提示:
Build Error: go build -o e:\go\src\1go\1day\1_hello__debug_bin.exe -gcflags all=-N -l .
go: go.mod file not found in current directory or any parent directory; see 'go help modules' (exit status 1)
原因分析结果就是在那个项目目录下未发现go.mod;因此解决方法就是切换至项目目录下,执行go mod init命令,初始化项目即可产生go.mod。然后我又继续在vscode终端里用了这个命令,提示我又出错了。
新创建的golang项目,使用 go mod init 命令时出现 cannot determine module path for source directory xxxxxxx (outside GOPATH, module path must be specified)
后来搜查得知这是因为go mod init 初始化项目时,需要定义一个 module ,当打开一个 go.mod 文件,就会发现第一行就有module ProjectName。因此,在执行 go mod init 时需要定义 module,即:go mod init ProjectName
今天笼统回顾了go语言的基础语法
首先先去查了关键字作为了解,下面列举Go代码中会使用到的25个关键字或保留字:
| break | default | func | interface | select |
|---|---|---|---|---|
| case | defer | go | map | struct |
| chan | else | goto | package | switch |
| const | fallthrough | if | range | type |
| continue | for | import | return | var |
除了以上介绍的这些关键字,Go 语言还有 36 个预定义标识符:
| append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
|---|---|---|---|---|---|---|---|---|
| copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
| int32 | int64 | iota | len | make | new | nil | panic | uint64 |
| println | real | recover | string | true | uint | uint8 | uintptr |
go 语言的数据类型,简要概括为布尔类型、数字类型、字符串类型、派生类型 。 其中派生类型又包括:指针类型、数组类型、结构化类型、 Channel 类型、函数类型、切片类型、接口类型、 Map 类型。****
Go 语言变量,跟其他语言一样,储存结果或表示值抽象概念。
Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
声明变量的一般形式是使用 var 关键字:var identifier type
可以一次声明多个变量:var identifier1, identifier2 type
Go语言的条件语句今天了解两个典型。
其一是if...else 语句,其语法如下:
if 布尔表达式 {
/* 在布尔表达式为 true 时执行 */
} else {
/* 在布尔表达式为 false 时执行 */
}
其二是switch 语句。switch 语句用于基于不同条件执行不同动作,每一个case分支都是唯一的,从上至下逐一测试,直到匹配为止。整个执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加break。默认情况下case最后自带break语句,匹配成功后就不会执行其他case。其语法如下:
switch var1 {
case val1:
...
case val2:
...
default:
...
}
Go语言的循环语句基础是讲了for循环。
在今天PPT中展示的代码中Go语言的for循环有3种形式。
1.和C语言的for一样:for init; condition; post { }
2.和C的while一样:for condition { }
和C的for(;;) 一样:for { }
一点补充:
init:一般为赋值表达式,给控制变量赋初值;
condition:关系表达式或逻辑表达式,循环控制条件;
post:一般为赋值表达式,给控制变量增量或减量。
Go语言数组
Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:
var arrayName [size]datatype
其中,arrayName 是数组的名称,size 是数组的大小,dataType 是数组中元素的数据类型。
Go语言切片
Go数组的长度不可改变,在特定场景中这样的集合就不太适用,而在Go中切片就好比是"动态数组",与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。切片不需要说明长度。所以声明一个未指定大小的数组来定义切片:
var identifier []type
视频中所展示的就是使用 make() 函数来创建切片: var slice1 []type = make([]type, len)
但是被简写为slice1 := make([]type, len)
Go 语言 Map
Map是一种无序的键值对的集合,说白了类似于python中的字典。通过key来快速检索数据,key类似于索引,指向数据的值。Map是无序的,遍历Map时返回的键值对的顺序是不确定的。
在获取Map的值时,如果键不存在,返回该类型的零值,例如int类型的零值是0,string类型的零值是""。Map是引用类型,如果将一个Map传递给一个函数或赋值给另一个变量,它们都指向同一个底层数据结构,因此对Map的修改会影响到所有引用它的变量。
两个简单实例:
创建一个空的 Map:m := make(map[string]int)
创建一个初始容量为 10 的 Map:m := make(map[string]int, 10)
获取键值对:
v1 := m["one"]
v2, ok := m["two"]
假如说键不存在,ok的值为false,v2的值为该类型的零值。
修改键值对:
m["five"] = 5
获取 Map 的长度:
len := len(m)
遍历 Map:
for k, v := range m {
fmt.Printf("key=%s, value=%d\n", k, v)
删除键值对:
delete(m, "one")
Go 语言 Range
Go 语言中range关键字用于for循环中迭代元素。在数组和切片中它返回元素的索引和索引对应的值,在map中返回key-value对。
找到的格式如下,代码中的key和value是可以省略的
for key, value := range oldMap {
newMap[key] = value
}
Go 语言函数****
函数的声明定义:****
//func关键字
//getStudent函数名
//(id int, classId int) 参数列表
//(name string,age int) 返回值列表
func getStudent(id int, classId int)(name string,age int) {
//函数体
if id==1&&classId==1{
name = "BigOrange"
age = 26
}
//返回值
return name, age // 支持多重返回值
}
函数的调用:****
import "fmt"
//调用fmt包中的Println方法。
fmt.Println("Name:", std.Name, "Age:",std.Age)
只能说基础得打好,语法不说很熟,但至少要了解个大概。常用语法更是要熟练。要不然像我今天有很多都没有看懂。
今天就写到这里吧,只记住些很基础的东西。算是给自己做个巩固。