Go语言快速上手笔记 | 青训营笔记

77 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

一、什么是Go语言

Go语言的特点

  1. 高性能、高并发 具有丰富的多线程标准库
  2. 语法简单、学习曲线平缓 基于C语言 循环只有for循环
  3. 丰富的标准库 和python一样具有丰富的标准库,不需要导入第三方库便可实现常用功能,相较第三方库更加的高效稳定。
  4. 完善的工具链 单元测试调试等工具
  5. 静态链接 所有编译都是静态连接 便于部署
  6. 快速编译 编译速度快
  7. 跨平台 支持交叉编译
  8. 垃圾回收 和java类似的垃圾回收机制,无需考虑内存的垃圾回收

二、基础语法

2.1 Hello World

main 包是程序的入口包,fmt是输入输出标准库包

package main

import  "fmt"

func main(){
	fmt.println("Hello,World")
}

2.2 变量类型

go是一门强类型语言 常见类型:

string	
int(int8 int16 int32 int64)	
float(float32 float64)	
bool

变量的声明方式 变量的声明一般使用以下两种方式 var a = 表达式 a的类型被赋予表达式所返回的结果类型 a:= 表达式 :=和=不同,:=用于初始化变量赋值,=用于给已经声明过的变量赋值。若如下面代码中变量a未声明,变量b已经声明,程序在编译后会自动对a进行初始化变量赋值,对b直接赋值。 `` a,b:=表达式

2.3 基础语法

  1. for 循环 Go语言只有for循环这一种循环语句。for循环有多种形式,其中一种如下所示:
for initialization; condition; post {
    // zero or more statements
}

for循环三个部分不需括号包围。大括号强制要求,左大括号必须和post语句在同一行。

initialization语句是可选的,在循环开始前执行。initalization如果存在,必须是一条简单语句(simple statement),即,短变量声明、自增语句、赋值语句或函数调用。condition是一个布尔表达式(boolean expression),其值在每次循环迭代开始时计算。如果为true则执行循环体语句。post语句在循环体执行结束后执行,之后再次对condition求值。condition值为false时,循环结束。

for循环的这三个部分每个都可以省略,如果省略initialization和post,分号也可以省略:

// a traditional "while" loop
for condition {
    // ...
}

如果连condition也省略了,像下面这样:

// a traditional infinite loop
for {
    // ...
}

这就变成一个无限循环,尽管如此,还可以用其他方式终止循环,如一条break或return语句。 2. if-else语句 正如for循环一样,if语句条件两边也不加括号,但是主体部分需要加。if语句的else部分是可选的,在if的条件为false时执行。

if condition {
    // ...
}else{
    // ...
}
  1. switch结构 这里是一个简单的switch的例子:
switch coinflip() {
case "heads":
    heads++
case "tails":
    tails++
default:
    fmt.Println("landed on edge!")
}

每一个case都会对应一个返回结果,Go语言并不需要在每一个case后写break,语言默认执行完case后的逻辑语句会自动退出。

Go语言里的switch还可以不带操作对象,switch不带操作对象时默认用true值代替,然后将每个case的表达式和true值进行比较;可以直接罗列多种条件,像其它语言里面的多个if else一样,下面是一个例子:

func Signum(x int) int {
    switch {
    case x > 0:
        return +1
    default:
        return 0
    case x < 0:
        return -1
    }
}

这种形式叫做无tag switch(tagless switch);这和switch true是等价的。

像for和if控制语句一样,switch也可以紧跟一个简短的变量声明,一个自增表达式、赋值语句,或者一个函数调用。

break和continue语句会改变控制流。和其它语言中的break和continue一样,break会中断当前的循环,并开始执行循环之后的内容,而continue会跳过当前循环,并开始执行下一次循环。这两个语句除了可以控制for循环,还可以用来控制switch和select语句,如果我们想跳过的是更外层的循环的话,我们可以在相应的位置加上label,这样break和continue就可以根据我们的想法来continue和break任意循环。

  1. 指针: Go语言提供了指针。指针是一种直接存储了变量的内存地址的数据类型。在其它语言中,比如C语言,指针操作是完全不受约束的。在另外一些语言中,指针一般被处理为“引用”,除了到处传递这些指针之外,并不能对这些指针做太多事情。Go语言在这两种范围中取了一种平衡。指针是可见的内存地址,&操作符可以返回一个变量的内存地址,并且*操作符可以获取指针指向的变量内容,但是在Go语言里没有指针运算,也就是不能像c语言里可以对指针进行加或减操作。

  2. 数组slice

//构建,slice可以无限制扩容。
var a []int{1,2,3}
b:= []string{"222","2333"}

//索引
fmt.println(a[0])

//切片,区间为左闭右开
c:=a[1:len(a)]

  1. Hashmap
//构建一个key为string,value为int的哈希表
map1 := make(map[string]int)
map2 := map[string]int{"one": 1} 
var map3 = map[string]int{"one": 1} 

//存入
map1["one"] = 1
map1["two"] = map1["two"]+2 //若哈希表key中无"two",会返回value的默认值,类似于JAVA的getOrDefault()方法

//删除
delete(map1,"one")
  1. range
//遍历map
for k,v :=range map{
	//..
}

//遍历slice
for i,v :=range a{
	//i:索引
	//v:数组中存放的元素
	//如果循环体内不对索引或者数值进行操作,可以用_代替,否则不使用的局部变量不能通过编译。
}
  1. 函数
func 函数名(参数1 类型,参数2 类型)(返回参数 类型){
return 
}
  1. 结构体
type user struct{
	name		string
	password	string
}
//结构体方法
func (u user) checkPassword(password string) bool{
	return u.password == password
}

//结构体方法调用
var user1 user{
	name: "111",
	password: "123"
}
user1.checkPassword("123")//true