Go语言基础 | 青训营笔记

365 阅读3分钟

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

Go语言环境搭建

安装Go

官网下载Go语言的安装包,然后按照要求安装即可。

安装完毕后,需要添加系统环境变量GOROOT,其值为Go的安装目录(安装过程中可以自定义),以及在Path里加上安装目录下的bin目录,然后在cmd中输入go version

然后就是配置IDE,我选择的是vscode。需要安装Go插件;并且安装插件依赖工具:调出命令面板输入go install tools,选择Go: Install/Update Tools

工作空间

Go的工作空间是由GOPATH环境变量指定的,在Go早期版本,GOPATH是必须的,即所有的Go项目代码都要保存在GOPATH指定的目录下。但是后面Go引入了Go Module,使用Go Module管理的项目可以放在GOPATH之外。

工作空间是Go比较特别的地方,它要求所有的项目代码都要放在工作空间中,包括自己写的项目代码以及从外部获取的代码可以存在该空间内。工作空间中存在三个文件夹:

  • src:存放项目源代码
  • pkg:存放编译生成的代码
  • bin:存放编译生成的可执行代码

在Go中,是将每一个项目都当作$GOPATH\src的一个包来看待,工作空间的概念就有点类似于Java中的classpath

classpathJVM用到的一个环境变量,它用来指示JVM如何搜索class

很多教程在配置Java环境时都会在系统变量中加上CLASSPATH环境变量,其中.代表当前目录。详见classpath和jar

Go中,GOPATH的作用就是指示一个工作空间:当Go编译文件时,在工作空间中搜索需要的包。

相关文章:Can someone explain why GOPATH is convenient and how it should be used in general?

Go语言基础

变量

定义变量有多种方式:

  • var <varName> <varType> = <value>
  • var <varName> = <value>
  • varName := value
var var1 string = "go"
var var2 = 10
var3 := true

// 常量就是将var换成const
const const1 = 0
  • _是一个特殊的变量名,任何赋予它的值都会被丢弃。
  • Go对于已声明但未使用的变量会在编译阶段报错

数据类型

int8, int16, int32(rune), int64 // 有符号整数
uint8(byte), uint16, uint32, uint64 // 无符号整数
bool // 布尔类型
float32, float64 // 浮点数
complex64, complex128 // 复数 一半位数作实数,一半位数作虚数
string // 字符串

不同类型之间的变量不允许相互赋值或操作,例如intint32之间的赋值

数据结构

  • array:静态数组(数组长度不可变)

    // var <arrayName> [<size>]<typeName>
    var arr [10]int
    // <arrayName> := [<size>]<typeName>{<initVals>}
    a := [3]int{1, 2, 3}
    b := [...]int{1, 2} // 自动根据元素个数来计算长度
    
  • slice:动态数组

    // 声明方式和array相比就是少了[]中的长度
    var slice []int
    var s1 := []int{1, 2, 3}
    
    // 可以通过append来向slice中增加内容
    s1 = append(s1, 3) // [1, 2, 3, 3]
    
  • map:字典

    // var <mapName> map[<keyType>]<valueType>
    var m map[string]int
    // <mapName> := make(map[<keyType>valueType])
    mp := make(map[string]int)
    m1 := map[string]int{"c":1, "c++":2, "go":3}
    

控制流

Goif-elseforswitch-case三大结构,唯一需要注意的是Go中条件表达式不需要用括号包裹。

// if-else
i := 1
if i > 0 {
    // ...
} else {
    // ...
}

// for
for i := 0; i < 10; i ++ {
    // ...
}

// switch-case
switch i {
    case 1: // ....
    case 2: // ...
    // ...
    default: // ...
}

函数

/*
func funcName(arg1 type1, arg2 type2, ... ) (ret1 type1, ret2 type2) {
    // ...
}
*/
func add(a int, b int) (res int, ok bool) {
    // ...
}

fmt

import "fmt"

fmt.Println() // 打印一行
fmt.Printf("%v", s) // 所有类型的变量都是用v通配符
fmt.Printf("%+v", s) // 输出关于s变量的详细信息
fmt.Printf("%#v", s) // 更加详细
f := 3.1415
fmt.Printf("%.2f", f)

拥有以上知识基本上就可以写一些简单的程序了