Go快速入门(一) | 青训营

180 阅读5分钟

1. Go语言介绍

1.1 Go语言特点

  1. 高性能、高并发
  2. 语法简单、学习周期短
  3. 有丰富的标准库
  4. 工具链完善
  5. 静态链接
  6. 可快速编译
  7. 可跨平台
  8. 自动垃圾回收

1.2 为什么学Go

国内外很多大厂都在用

字节 腾讯 美团 滴滴 百度 B站 oppo 深信服 360 七牛云

Google Facebook

1.3 为什么字节全面拥抱Go

  1. 最初使用python,由于性能问题换Go
  2. C++不适合在线web业务
  3. 早期团队非Java背景
  4. 性能佳
  5. 部署简单,学习成本低
  6. 内部RPC和HTTP框架推广

2. 开发环境配置

2.1 安装Golang

通过官网安装

国内镜像

配置goproxy 作用是加快github访问速度 可以不配

2.2 配置Golang编辑器或集成开发环境

2.2.1 VScode Visual Studio Code - Code Editing. Redefined

(需要装插件 优点是可以写Java python go c 等多种语言)

2.2.2 GoLand jetbrains.com/go/

2.2.3 IDEA IntelliJ IDEA – 领先的 Java 和 Kotlin IDE (jetbrains.com)

(装插件后 也可写多种语言程序)

GoLand和IDEA都是Intellij产品 学生用户凭邮箱等可白嫖

2.2.4 云开发环境

gitpod.io/#github.com…

短链接 hi-hi.cn/gitpod

3. 基础语法

3.1 Hello word

//声明程序属于哪一个包 main表示程序入口包
package main 

//导入fmt包 用于输入输出字符串 格式化字符串
import(
    "fmt"
) 

func main(){
    fmt.Println("Hello word")
}

3.2 变量

package main

import "fmt"

func main() {
    // 方法一:指定变量类型 并赋值
    var nun1 int = 19
    
    // 方法二:指定变量类型 不赋值 使用默认值
    var num2 int
    
    // 方法三:可以不指定变量类型 自动判断
    var a = "initial"
    
    // 方法四:省略var 将等号换成  :=  
    num4 := 4
    
    // 一次声明多个变量
    var n1,n2,n3 int
    
    var n4,name,n5 = 10,"mary",7.8
    
    n6,sex := 7.9,"女"
    
}

3.3 运算符

+ - * / % 与其他语言一致 分别为加减乘除取模

++ --  两个运算符只能写在变量后面 不能写在变量前面
--a //这是错误写法

< > <= >= != && || ^ 与其他语言一致

& :返回变量存储地址
* :取指针变量对应数值

var age int = 18
fmt.Println("age对应的存储空间地址为:",&age) //age对应的存储空间地址为:0xc0000100b0

var ptr *int = &age
fmt.Println("ptr这个指针指向的具体数值为:",*ptr) 

// 常量声明 将var改为const
const h = 3141

3.4 if-else

package main

import "fmt"

func main() {
    num := 10
    if num<20 {
        num--
    }else if num ==20{
        num++
    }else{
        fmt.Println(num)
    }
    // if后必须有空格 
    // ()可以省略
    // 即便代码只有一行 也不能与if写在同一行
}

3.5 for循环(go语言中没有while循环 没有do while循环 只有for)


package main

import "fmt"

func main() {
    // 死循环
    i := 1
    for {
        i++
        fmt.Println(i)
    }
    
    // 已知循环次数
    for j := 7;j < 9; j++{
    fmt.Println(j)
    }
    
    //类while
    for i < 10{
        i++
    }
    
    // 可使用break退出循环 或者用continue 进入下次循环
    
}

3.6 switch

package main

import "fmt"

func main() {
    a := 2
    switch a{
    case 1:
        fmt.Println("1")
    case 2:
        fmt.Println("2")
    case 3:
        fmt.Println("3")
    default:
        fmt.Println("不知道")
    }
    
    // 默认不需要加break
    // case中可写条件分支
}

3.7 数组

package main

import "fmt"
    
func main() {
    // 定义数组
    // 方法一:先定义后赋值
    var arr int[5]
    // 赋值
    arr[4] = 313
    
    // 方法二:定义时赋值
    arr2 := [3]int{1,2,4}
    
    // 方法三:未知数目直接赋值
    arr3 := [...]int{3,4,5,6,7,8,9}
    
    // 方法四:连续赋值
    arr4 := [...]int{2:44,5:35,3:67}
    
    // 二维数组的定义
    twoarr := [3][3]int{{23,4,5},
                        {2,5,6},
                        {4,4,6}}
    
    //遍历
    for key,value := range arr{
        // key表示元素下标
        // value表示元素值
        fmt.Println("第%d个数的值为:%d\n",key,value)
    }
}

3.8 切片slice

slice空间可动态改变 所以比数组好使用 但是也有其空间限制 注意不要越界

package main

import "fmt"

func main() {
    // 方法一:使用make创建切片
    // slice := make([]类型,切片长度,切片容量) 其中容量可省
    s := make([]string,3)
    // 赋值
    s[0] = "a"
    s[1] = "b"
    s[2] = "c"
    // 追加元素append 但是结果必须被接收 
    // slice容量不够时自动扩容后地址会改变
    s = a.append(s,"d")
    
    // 方法二:通过数组转换
    arr := [...]int{23,241,3,4,5,2,5,4}
    s1 := arr[1:3] // 取arr的第1到第3个创建切片
    
    // 方法三:copy
    b := make([]int,5)
    copy(b,s1) 
    
    
    // 切片操作
    fmt.Println(s[2:5]) //[c d e]
    // 从第2个元素起,不包括第5个元素
    // 也可以写s[2:] 表示从第2个开始到结束
    // 需要注意的是 与Python不同 go语言中-1不表示最后一个元素
    
    // 快速定义
    good := []string{"a","s","d","f","g","h"}
    
    // 方法调用
    fmt.Println("切片长度:",len(good)) // 切片长度:6
    fmt.Println("切片容量:",cap(good))
    
    // 遍历
    for i,v := range(good){
        fmt.Println("下标:%v,元素:%v\n",i,v)
    }
}

3.9 map

map 特点

  1. 使用前必须make
  2. key-value无序
  3. key不可重复,重复后以后者替换前者的value
  4. value可重复
package main

import "fmt"

func main() {
    // 定义
    // 方法一:先定义 用时再确定空间
    var a = map[int]string 
    a = make([int]string,10)
    
    // 方法二:定义时确定类型和空间
    m := make([int]string,10) //三个参数分别为key类型 value类型 空间大小(可省)
    
    // map操作
    // 添加元素
    m[18] = "迪丽热巴"
    m[20] = "古力娜扎"
    m[19] = "马儿扎哈"
    m[100] = "老王八"
    
    // 删除元素
    delete(b,100)
    
    // 查找元素
    value,flag := n[19] //返回的flag为boolean类型
    
    // 获取长度
    len(m)
    
    // 遍历
    for k,v := range m{
        fmt.Println("key:%v,value:%v\n",i,v)
    }
}