这是我参与「第五届青训营 」笔记创作活动的第一天。
一、本堂课重点内容:
- GO的简单认识和基本语法
二、详细知识点介绍:
Go语言的一些重要特点:
Go语言拥有高性能、高并发优势,它学习起来成本相对较低,语法比较简单,它拥有丰富的标准库和完善的工具链,通过Go语言开发的效率完全不会低,而且Go是静态链接编译的,这使得Go开发出来的软件只需要一个可执行文件即可运行出来,同时Go还有垃圾回收机制,很多时候无需自己手动关闭资源。
Go的基本语法
- Hello World!
package main
import "fmt"
func main() {
fmt.Println("Hello World!")
}
在Go语言中,程序是以main包下的main函数开始运行的。
- 创建变量
因为Go是一门弱类型的语言,所以创建变量和常量和js差不多
var a = "good"
var b = 6
var c int = 1
const d = 98
当然,Go中还有一种更方便的创建变量的方法
e := 567
我个人比较喜欢用这个。
- 分支语句
和大多数语言一样Go语言也支持if...else语句以及它的嵌套和switch语句
特殊的是,Go中if语句和switch语句是可以不写括号的,switch语句中也不用写break
而且switch语句中的case可以直接接着写条件
具体如下:
if 3>2 {
fmt.Println("right!")
}else{
fmt.Println("???????")
}
switch{
case 1<2:
fmt.Println("of course")
default:
fmt.Println("hhhh")
}
- 循环语句
在Go中并没有while循环,只有for,而且也是不用写括号的
而且也可以直接写一个for加一个大括号表示死循环,也可以只写条件
同样的,可以使用return、break、continue
for{
fmt.Println("这个不跳出的话你就····")
break;
}
j:=1
for j<=3{
fmt.Println(j)
j+=1
}
for i:=0; i<3; i++{
fmt.Println("跳了",i,"次")
}
- 数组
与大多数的语言差不多,Go也可以创建数组与多维数组
初始化也差不多,也有通过索引赋值和大括号赋值
不过很方便的一点的是,可以直接打印出数组
代码如下
var a [5]int
a[4] = 100
fmt.Println(a[4],len(a))
b := [5]int{1,2,3,4,5}
fmt.Println(b)
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i+j
}
}
fmt.Println("2d:",twoD)
- Map
如同Python中的字典或是Java中的HashMap一样,Go中也有Map这种键值对的结构
其中有许多有意思的地方就比如Go中自带了一个状态变量来接收是否成功取出值
而且如果Map中没有对应Key的话,会取出0
Map中还有许多的操作方法,具体可以查查
代码如下:
m := make(map[string]int)
m["one"]=1
m["two"]=2
fmt.Println(m)
fmt.Println(len(m))
fmt.Println(m["one"])
fmt.Println(m["err"])
r , ok := m["op"]
fmt.Println(r,ok)
delete(m,"one")
fmt.Println("删除之后",m)
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
fmt.Println(m2,m3)
- range操作
Go同样支持range遍历操作,用起来也是非常的方便
一般来说,第一个变量接收的是索引或是Key,第二个变量接收的是值
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums {
sum += num
if num == 2 {
fmt.Println("index : ", i,"num: ", num)
}
}
fmt.Println(sum)
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v)
}
for k := range m {
fmt.Println("key", k)
}
- 函数
Go中的函数写法与大多数的语言不同的地方在于
它变量的类型的定义是写在变量后面的,而且返回值的类型也是写在函数名整体的最后
同时,Go中的参数列表的变量类型是相同的话,可以直接在参数列表最后写变量类型就够了
func add(a int,b int) int{
return a+b
}
func add2(a,b int) int {
return a+b
}
func exists(m map[string]string,k string) (v string,b bool) {
v, b =m[k]
return v,b
}
- 指针
在Go中同样也有指针的存在
只不过我感觉Go中的指针对于开发者的存在意义就是区分值传递与地址传递
这一点就不像C或是C++,它没有那么复杂,可以说是简化了许多编码时的烦恼
具体代码如下:
func add2(a int){//调用之后main函数中的a不会改变值
a += 2
}
func add2ptr(a *int){//调用之后main函数中的a会改变值
*a += 2
}
- 结构体和结构体方法
在Go中没有类的说法,取代这一概念的是结构体与结构体方法
在Go中的结构体定义与调用都比在C或C++中要简单了一些,因为是弱类型的语言
结构体方法的定义也是,只要在函数名后指定是哪个结构体的方法就行
具体代码如下:
type user struct {
name string
pw string
}
func main() {
a := user{name: "li",pw: "1234"}
b := user{"www","1212"}
c := user{name: "usus"}
var d user
d.name="haha"
d.pw ="898"
fmt.Println(a,b,c,d)//{li 1234} {www 1212} {usus } {haha 898}
}
- 错误处理
在Go中错误处理没有像Java一样严肃,有着抓抛模型
而是在函数后面返回一个值
如果想自定义一个错误的话也可以直接调用errors.New( string )
具体代码如下:
type user struct {
name string
pw string
}
func findUser(users []user,nm string) (v *user,err error) {
for _, u := range users {
if u.name == nm {
return &u,nil//nil代表null即空值的意思
}
}
return nil, errors.New("Not Found!!")
}
其他的API操作:
- 字符串操作
- JSON处理操作
- 时间处理操作
- 数字处理操作
- 进程操作
这些API操作具体可以在官方文档中自行搜索或是通过官方文档了解,在此不过多赘叙了
中文官方文档:
三、课后个人总结:
在我看来Go语言是一种非常舒服的语言
它并不像C、C++或是Java一样过于严肃,虽然基本的顺序、分支、循环语法都大差不差
但是Go中去掉了许多我认为那些之前语言中我认为比较冗余的部分(像while,感觉我写代码的时候用的非常少)
但是Go语言也是有着它的个性,它如果要规定类型一般都是写在变量的后面,这一点是写Go的时候需要注意的,因为不少语言都是写在变量前面给变量做类型约束
还有不可忽视的一点的是,Go在高并发场景下作为开发语言是有独特优势的
不论是Go的快速编译还是它的协程操作方法,以及构建多线程场景,处理大量请求,它都非常方便和优雅
以上就是我第一次接触Go这门语言的总体印象