第一次接触GO | 青训营笔记

81 阅读6分钟

这是我参与「第五届青训营 」笔记创作活动的第一天。

一、本堂课重点内容:

  • 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语言标准库文档中文版

三、课后个人总结:

在我看来Go语言是一种非常舒服的语言

它并不像C、C++或是Java一样过于严肃,虽然基本的顺序、分支、循环语法都大差不差

但是Go中去掉了许多我认为那些之前语言中我认为比较冗余的部分(像while,感觉我写代码的时候用的非常少)

但是Go语言也是有着它的个性,它如果要规定类型一般都是写在变量的后面,这一点是写Go的时候需要注意的,因为不少语言都是写在变量前面给变量做类型约束

还有不可忽视的一点的是,Go在高并发场景下作为开发语言是有独特优势的

不论是Go的快速编译还是它的协程操作方法,以及构建多线程场景,处理大量请求,它都非常方便和优雅

以上就是我第一次接触Go这门语言的总体印象