这是我参与「第五届青训营 」伴学笔记创作活动的第 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结构体
多个数据的集合的数据类型。
2.12
命名结构体方法时需要
总结
go语言的定义方式通常都是name type,即名称在前,类型在后,并且if、for、switch等语句条件中的括号都可以忽略,同时建议不写括号,不然有时会报错。当一个语句后没有其它语句时分号;不需要加。不同于java,当声明了一些没有使用的变量或导入没有使用的库时,go会无法编译运行。go语言的总体基本语法与c、c++、java等语言有很大不同,学习时需要仔细辨别其中的区别,同时需要多动手敲代码熟悉语法逻辑。