Go语言基础 | 青训营笔记

87 阅读4分钟

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

1.go简介

1.1go语言特点

高性能高并发 ,语法简单,学习曲线平缓 ,标准库丰富 ,工具链完善 ,静态链接 ,快速编译 ,跨平台 ,垃圾回收

1.2go语言现状

因为go语言的高性能,易部署等方面的特点,字节现已让go语言作为主要程序设计语言。除此之外,例如百度、美团、腾讯、谷歌等大厂也逐渐让go语言作为主要开发语言。

1.3编译环境

可以选择vscode或者golang,vscode免费而golang收费,此外选择vscode需要安装对应go插件。

2.go语言入门

2.1输出

通常调用fmt的Println方法(输出且换行)进行输出,此外还有Print(输出不换行),Printf(格式化输出)。方法名开头大写意味着在其它包里也可以被调用。

fmt.Println("hello world")

2.2变量声明

var为go的声明关键字,:=的方式可以方便快捷地创建一个变量,为开发时常用的手段。常量没有确定类型,根据上下文自动推导具体类型。

	var a int//声明
	var b int =1//赋值
	var c =2//自动推导
	d:=3//简单创建一个值,最常用的方法
        const s string="haha"
        const ss=123

2.3if-else语句

go语言中if后的判断条件不需要加括号(可加可不加),就算判断语句内只有一行代码也要用花括号括起来,同时判断条件后要紧跟着第一个花括号,而随后的else if或else语句则需要紧跟在上一个判断语句的第二个花括号后面。

	var a =1
	if a==2{
		fmt.Println("haha222")
	}else if a==3{
		fmt.Println("haha333")
	}else{
		fmt.Println("haha111")
	}

2.4switch语句

go语言的switch语句支持许多数据类型的判断,包括字符串,结构体等。case后能接判断语句。在每一个case中break都是隐式存在的,所以当执行完一个case后会自动跳出switch,不需要像其它语言一样手动在每一个case中写个break

	var a = 1
	switch a{
	case 1:
		fmt.Println("one")
	case 2:
		fmt.Println("two")
	case 3:
		fmt.Println("three")
	default:
		fmt.Println("haha")
	}
	t:=time.Now()
	switch{
	case t.Hour()<12:
		fmt.Println("before noon")
	default:
		fmt.Println("after noon")
	}

2.5数组

只能固定大小,相对于切片不怎么常用

	var arr [3]int//声明一个长度为3的数组
	arr[0]=0
	arr2:=[]int{1,2,3,4}//长度可指定可不指定
	fmt.Println(len(arr2))

2.6切片

可用make创建,用append添加元素,copy拷贝切片。使用append时需要把新切片赋值给源切片,因为切片一开始是按固定大小存储的,添加了一个新元素后如果超出容量则会扩容,新建一个切片,这时就需要赋值。

	s := make([]int, 3) //类型与长度
	s[0] = 1
	fmt.Println(s) //[1 0 0]
	s = append(s, 666)
	fmt.Println(s) //[1 0 0 666]
	c := make([]int, len(s))
	copy(c, s)
	fmt.Println(c) //[1 0 0 666]

2.7map

key-value对,又称键值对,形如哈希表。

	m := make(map[string]int)
	m["one"] = 1

	r, ok := m["unknown"]//判断值是否存在
	fmt.Println(r, ok) //0 false

	delete(m,"one")//删除

2.8range

可用于遍历数组,切片,键值对,设两个值分别等于数组的下标和值,或键值对的键和值。

	nums:=[]int{1,2,3}
	for i,num:=range nums {
		fmt.Println("index=",i,"value=",num)
	}
	m:=map[string]int{"a":1,"b":2}
	for k,v:=range m{
		fmt.Println("key=",k,"value=",v)
	}

2.9函数

go语言中函数的声明方式为func name(valueType value...)returnType{},并且函数中可以有多个返回值,多个返回值需要写在括号中用逗号分隔。

package main

import (
	"fmt"
)

func add(a int,b int)int{
	return a+b
}
func isExist(m map[string]string,str string)(v string,ok bool){
	v,ok=m[str]
	return v,ok
}
func main() {

	fmt.Println(add(1,10))
	m:=make(map[string]string)
	m["A"]="a"
	v,ok:=isExist(m,"A")
	fmt.Println(v,ok)
}

2.10值传递/地址传递

go语言中的函数都是值传递,在函数体中使形式参数值发生改变不会影响到实际参数,因此想要使实际参数发生改变需要改为地址传递,即将函数参数改为指针类型,实际参数传进函数时需要加上&引用符号。

package main

import (
	"fmt"
)

func change(a *int) {
	*a += 100
}

func main() {
	a := 1
	change(&a)
	fmt.Println(a)//101

}

2.11结构体

多个数据的集合的数据类型。

image.png

2.12

命名结构体方法时需要

image.png

总结

go语言的定义方式通常都是name type,即名称在前,类型在后,并且if、for、switch等语句条件中的括号都可以忽略,同时建议不写括号,不然有时会报错。当一个语句后没有其它语句时分号;不需要加。不同于java,当声明了一些没有使用的变量或导入没有使用的库时,go会无法编译运行。go语言的总体基本语法与c、c++、java等语言有很大不同,学习时需要仔细辨别其中的区别,同时需要多动手敲代码熟悉语法逻辑。