GO语言学习|青训营笔记

113 阅读1分钟

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

由于青训营的项目笔者打算用GO实现,于是快马加鞭开始了学习之旅,下面我将介绍golang的基础知识。

用package关键字定义一个包名,import导入其他的包,主函数的包名定义为main

package main

import(
    "fmt"
    "math/rand"
    "time"
)

导入包之后,就可以使用在外部定义的函数,但要记住,只有首字母大写的函数才能给其他包调用。

编译和运行

package main

import (
   "fmt"
   "math/rand"
   "time"
)

func main() {
   rand.Seed(time.Now().Unix())
   a := rand.Intn(10)
   b := rand.Intn(10)
   switch {
   case a > b:
      fmt.Printf("%d > %d", a, b)
   case a < b:
      fmt.Printf("%d < %d", a, b)
   default:
      fmt.Printf("%d = %d", a, b)
   }
}
//一段完整的代码

在window操作系统下,win+R输入cmd打开,将工作目录切换到我们代码所在的目录下输入

go build 文件名.go

执行成功后会在本地生成可执行文件,输入文件名运行即可

./文件名

变量

变量的声明方式:

var a int64 = 2
var b bool
c := "study"
//短变量声明只能在函数中使用

声明一个变量时,如果没有赋初值,系统会自动给他分配这个类型是零值,数值类型的(如int)零值为0,bool类型的零值为false,字符串类型的零值为“”,其他如指针、切片、函数、接口(interface)这一类的零值为nil。

数组(array)

var arr = [3]int{1, 2}
//这里只赋了前两个值
fmt.Println(arr)
arr[2] = 4
fmt.Println(arr)
//输出: [1 2 0]
//      [1 2 4]

用复合声明一个数组:

arr := [...]int{1, 2}
//用"..."代替指定数组大小,go会自己统计元素的个数
fmt.Println(arr)
//输出: [1 2]

数组的大小是固定的,与之相比,slice就更加灵活

切片(slice)

slice与array类似,但不同的是,slice是引用类型,每一个slice总会指向底层的一个array

//在数组或者切片上截取一段切片array[n:m],含有元素n到m-1
arr := [...]int{1, 2, 3, 4}
s1 := arr[1:2]
//s1 = [2 3]
s2 := arr[:]
//s2 = [1 2 3 4]

//或者直接声明一个切片
var sli = make([]int, 4) 
sli[0] =  1
//sli = [1 0 0 0]

slice还可以扩容,如果指定了cap(容量)这一属性,那么在使用append往切片中添加元素时,只要切片的len(长度)没有超过cap,那么这些切片共用底层同一个数组,如果修改一个切片的值,其他切片的值也会跟随着改变。

var sli = make([]int, 2, 4)
//2是切片的长度(len),4是容量(cap)如果不指定cap则默认cap=len
sli[0] = 1
sli[1] = 2
cop := sli
sli = append(sli, 3, 4)
cop = append(cop, 4, 5)
fmt.Println(sli)
fmt.Println(cop)
//输出 [1 2 4 5]
//     [1 2 4 5]

sli = append(sli, 6)
sli[2] = 7
fmt.Println(sli)
fmt.Println(cop)
//输出 [1 2 7 5 6]
//     [1 2 4 5]

控制结构

go中的控制结构较少,主要有for,if-else,switch,还有用于协调channal管道间通讯的select结构。

  • if-else
if err != nil {
    return err
    //错误信息返回
}

if x > y {
    return x
} else {
    return y
}

在if-else语句中也可以初始化变量

rand.Seed(time.Now().Unix())
//随机数种子
if x := rand.Intn(10); x > 5 {
   return true
} else {
   return false
}
  • for

for循环主要有3种形式:

for i := 1; i < 10; i++ {
   fmt.Println(i)
   //打印数字1-9
}
//与C的for类似
i := 1
for i < 10 {
    fmt.Println(i)
    i++
    //打印数字1-9
}
//相当于while
i := 1
for {
   if i > 9 {
      break
   } else {
      fmt.Println(i)
      i++
      //打印数字1-9
   }
}
//死循环,需要用break,return之类退出
  • switch

一般的switch形式:

switch i{
    case 0:
        fmt.Println("zero")
        fallthrough
        //fallthrough表示匹配成功后,switch还会继续执行下一个case中的内容
    case 1:
        fmt.Println("one")
        //xxxx
    default:
        //与前面的选项都不匹配时,就会执行default中的语句
}

也可以不指定switch后的表达式,这时switch会匹配case后的语句是否为True

switch {
    case a > b:
        fmt.Println("a > b")
    case a < b:
        fmt.Println("a < b")
    default:
        fmt.Println("a = b")
}