Go 语言入门:基础语法和常用特性①|青训营

78 阅读4分钟

Golang的优势

  • 极简单的部署方式

    • 可直接编译成机器码
    • 不依赖其他库
    • 直接运行即可部署
  • 静态类型语言

    • 编译的时候检查出来隐藏的大多数问题
  • 语言层面的并发

    • 天生的基因支持
    • 充分的利用多核
  • 强大的标准库

    • runtime系统调度优势
    • 高效的垃圾回收
    • 丰富的标准库
  • 简单易学

    • 25个关键字
    • 内嵌c语言支持,简洁
    • 面向对象特征
    • 跨平台
  • 大厂领军:Google、facebook、腾讯、百度、京东、字节、七牛云等

Golang的应用

(1)云计算基础设施领域

代表项目:docker、kubernetes、etcd、consul、cloudflare CDN、七牛云存储等。

(2)基础后端软件

代表项目:tidb、influxdb、cockroachdb等。

(3)微服务

代表项目:go-kit、micro、monzo bank的typhon、bilibili等。

(4)互联网基础设施

代表项目:以太坊、hyperledger等

go语法

初见

package main //定义包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包.package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。/*
import "fmt"  //告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。
import "time"
*/import (
    "fmt"
    "time"
)
​
func main(){ //左花括号必须与函数名在同一行!!
    fmt.Println("Hello Go!")
    //表达式加不加分号;都可以,建议不加
    time.Sleep(1*time.Second)
}

变量

关键字:var

  • 声明单个变量

1、声明后不赋值,使用默认值0

var a int

2、声明给定初始化值

var b int =100

3、在初始化时,省去数据类型,通过值自动匹配当前的数据类型

var c = 100

4、(常用)省去var关键字,直接自动匹配 := (只能用在函数体内)

c := 100

注意:声明全局变量时,可以用方法1/2/3,但是不能用方法4

  • 声明多个变量

var xx,yy int =100,200 xx=100 yy=200

var kk,ll = 100, "abcd" kk=100 ll="abcd"

var ( //多行的多变量声明
    vv int=100
    jj bool=true
)

常量

关键字:const

const length int = 10

枚举:

const ( 
    /*
    BEIJING = 0
    SHANGHAI = 1
    SHENZHNE = 2
    */
    //可以在const()中添加关键字 iota ,这样每行的iota都会加1,第一行是0
    BEIJING = iota //0
    SHANGHAI  //1
    SHENZHNE   //2
)

函数

//1、只有一个返回值
func 函数名(参数1名 参数1类型,参数2名 参数2类型) 返回值类型{
    return 返回值
}
//2、多返回值
func 函数名(参数1名 参数1类型,参数2名 参数2类型) (返回值1类型,返回值2类型){
  return 返回值1,返回值2
}
//3、多返回值,返回值有形参名称 
func 函数名(参数1名 参数1类型,参数2名 参数2类型) (返回值1 返回值1类型,返回值2 返回值2类型){
 
    return 
}
//4、多返回值,且类型相同
func 函数名(参数1名 参数1类型,参数2名 参数2类型) (返回值1 ,返回值2 类型){
 
    return
}

init函数

31-init.png

import导包

  • import _ "fmt" 给fmt包起一个别名(匿名),无法使用此包的方法,但是会执行包内部的init()方法
  • import aa "fmt" 给fmt起一个别名aa,可以通过aa.Println()调用包内部的方法
  • import ."fmt" 将fmt包中的全部方法,导入到当前本包的作用域中,就可以直接使用API来调用fmt包中的方法,不需要用fmt.方法

指针

*p 取值

&a 取地址

引用传递(指针):在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

/* 定义交换值函数*/
func swap(x *int, y *int) {
   var temp int
   temp = *x    /* 保持 x 地址上的值 */
   *x = *y      /* 将 y 值赋给 x */
   *y = temp    /* 将 temp 值赋给 y */
}

值传递:在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

func swap(x, y int)  {
   var temp int
   temp = x /* 保存 x 的值 */
   x = y    /* 将 y 值赋给 x */
   y = temp /* 将 temp 值赋给 y*/
}

image.png

defer

1、预定对函数的调用,延迟函数。当执行完“}”之后才开始执行

2、如果一个函数中有多个defer语句,它们会以LIFO(后进先出)的顺序执行。

3、defer 和return 谁先执行? return后的语句先执行,defer后的语句后执行。