[ GO语言基础语法 | 青训营笔记 ]
标题:走进 Go 语言基础语言 - 掘金
一、Go语言特点
1.高性能、高并发
Golang的编译速度相对其他编程语言是非常快的。Golang的编译器采用静态编译方式,可以在几秒钟之内完成编译。
Golang是一种高效的并发编程语言,它的并发能力是其性能优势之一。Golang旨在处理高并发的场景,而其轻量级的协程机制可以大大提高多任务处理的效率。此外,Golang内置的并发安全内存管理机制也有助于在高并发环境下防止内存泄漏和死锁等问题。
2.语法简单、学习曲线平缓
Go语言语法简单,包含了类C语法。
3.丰富的标准库
Go语言本身就含有丰富的标准官方库,而不需要去自己寻找第三方库来辅助自己去进行开发,使用标准官方库已经可以应对大部分的开发内容了。
4.完善的工具链
Go语言含有丰富的工具链,不管是编译,代码格式化还是错误检查,包管理,代码补充提示这些都有对应的工具。
5.静态链接
在Golang中,所有的编译结果都是静态链接的,只需要拷贝唯一一个可执行文件,不需要附加任何东西,就可以运行。
6.快速编译
Go语言拥有所有静态语言里面最快的编译速度。
7.跨平台
Golang的跨平台特性也为其性能提供了优势。Golang可以在不同的平台上编译运行,包括Windows、Linux、Mac OS X等。因此,开发者可以使用Golang编写跨平台应用程序,而无需重构代码即可在不同的平台上运行。这也为程序的可移植性提供了便利。
8.垃圾回收
Go语言在编写的时候,无需考虑内存的分配释放,可以专注于业务逻辑。
二、Golang基础语法
学习所有的编程语言,都有一个通用的语句格式。也就是常说的Hello world!。下面,使用Golang进行编写。
package main
import (
"fmt"
)
func main(){
fmt.Println("hello world!")
}
这里使用了package import func 关键字,分别代表的意思是打包,导入包,函数的声明。一般来说以main命名的函数为整个项目的入口,从main开始逐步执行。
当编写好一个项目后,需要在终端中使用
go run 路径/项目.go
来使其运行,还可以在终端中使用
go build 路径/项目.go
./项目
将项目构建成一个可执行文件,运行可执行文件即可。
2.1 变量及常量
Golang中使用var关键字来声明一个变量,具体格式如下
var 变量名 变量类型 = 值
和其他编程语言有所不同的是,Golang在声明变量的时候,变量名在前,变量类型在后。当然,还可以通过使用 := 来进行声明一个变量。
a := 1
如上述代码,声明一个类型为整型,值为1的a变量,使用:=来进行声明的时候,前面变量的类型由后面值的类型决定。
Golang中在声明一个常量时候,使用const关键字来进行声明。在Golang里面的常量没有确定的类型,通常是根据上下文来自动确定类型。
const s string = "constant"
2.2 判断语句
golang中和其他编程语言有相同,也有不同,golang中的if后面没有小括号,但是需要有大括号。
if a > b {
}
Golang语言在执行判断语句前面,可以有一个简单的执行语句,使用;进行分隔。
if a := 10; a < 11 {
}
2.3 循环语句
在golang语言中,只有一种循环,for循环。
for循环的书写格式也是没有小括号的。
for i := 0; i < 10; i++ {
// 执行语句
}
但是可以通过不写初始赋值以及后置语句,来使其成为while循环。
for i > 10 {
// 执行语句
}
当需要执行一个死循环时,只需要在for后面什么都不写即可。我们可以使用 continue继续循环 或 break 跳出循环。
for {
// 执行语句
fmt.Println("loop")
break //跳出循环
}
2.4 switch 条件语句
Golang使用switch跟其他编程语言类似。
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
default:
fmt.Println("other")
}
在 Golang里面当执行完选择的分支语句后,不用使用break进行跳出,会自动跳出,不继续往下进行。
当在switch后面不添加变量,在每个case后面添加条件。
2.5 数组
Golang 在进行数组创建的时候,采用如下格式
var 变量名 [数组大小] 数组类型
// 创建一个有值的数组
var 变量名 [数组大小] 数组类型 {数组元素1,数组元素2,...}
可以使用 := 来给变量赋值一个数组。
var 变量名 := [数组大小] 数组类型 {数组元素1,数组元素2,...}
2.6 切片
切片可以理解成一个可变长的数组,通常使用 make 关键字来创建一个切片。
变量名 := make([]变量类型,大小)
可以使用append来给切片添加一个元素,具体用法如下:
s := make([]string,3)
s = append(s, "d")
当需要拷贝一个切片的时候,通常使用copy进行拷贝。
// 使用len来获取切片s的长度,作为切片c的长度
c := make([]string, len(s))
// 使用copy进行拷贝切片
copy(c, s)
可以使用如python语言中的切片操作,来取值。
s := []string{"a","b","c","d","e","f"}
fmt.Println(s[2:5]) // [c d e]
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e]
当需要创建一个的切片时
good := []strinng{"a", "b", "c"}
2.7 map
Golang 在创建一个map的时候,通常使用make来进行创建。
m := make(map[key的类型] value的类型)
使用delete函数去删除键值对。
delete(m, "one")
使用r, ok来查看这个map里面有没有key存在
r, ok := m["aaa"]
fmt.Println(r, ok) // 0 false
2.8 range
对于一个slice或者map,可以通过使用range来进行快速的遍历,具体语法如下
nums := []int{2, 3, 4}
// i 表示索引, sum表示值
for i, sum := range nums {
fmt.Println(i, sum) // index: 0 num: 2 | index: 1 num: 3| index: 2 num: 4
}
2.9 函数
在Golang的函数定义中,所有函数均使用 func 关键字开头,并且Golang推荐使用驼峰命名法来给函数命名。
在Go语言中,可见性通过命名首字母的大小写来进行确定,如首字母小写,则在其他包中无法被访问;如首字母大写,则可以在其他包被访问到。也就是Java中常说的public以及private。
函数的定义格式如下:
func add(x, y int) int {
}
// 定义一个名为 add 的函数方法
// 参数为x,y,并且都是int类型
// 返回值确定为int类型
在Golang语言中,可以有多个返回值参数。如
func toString(x, y string) (string, string) {
return y, x
}
函数的返回值是可以被命名的。当返回值是空的return语句时,则默认返回所有已经定义的返回变量。
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
2.10 指针
Golang语言的指针使用跟C语言类似,使用* 号用于指定变量是作为一个指针。使用&进行取指针的地址。
2.11 结构体
Golang在定义结构体的格式如下:
type 结构体名 struct {
字段 字段类型
字段 字段类型
}
可以使用结构体的名称去初始化一个结构体。在初始化的时候,需要传入初始值。
a := 结构体名{"值1","值2"}
b := 结构体名{字段1: "值1", 字段2: "值2"}
2.12 结构体方法
Golang 语言里面声明一个结构体方法格式如下:
// 不带指针
func (结构体变量名 结构体名) 方法名(参数 参数类型) 返回值类型{
}
// 带指针
func (结构体变量名 *结构体名) 方法名(参数 参数类型) 返回值类型{
}
2.13 错误处理
Golang在进行错误处理的时候,可以在函数的返回值里面添加一个 error类型的变量。
func fondNum(x int, y []int) (a int, err error) {
for _,i := range y {
if x == i {
retrun i, err
}
}
return nil, errors.Now("not fond")
}
2.14 字符串操作
在标准库strings包里面有非常多的字符串工具函数。
strings.EqualFold(s,t string)bool 使用EqualFold,您可以检查两个字符串是否相等。如果两个字符串相等,则返回输出true,如果两个字符串都不相等,则返回false
strings.HasSuffix(s string, suffix string) bool: 判断字符串s是否以suffix结尾。
strings.Index(s string, str string) int: 判断str在s中首次出现的位置,如果没有出现,则返回-1
strings.IndexByte(s string, c byte) int IndexByte函数返回字符串中第一个字符实例的索引。如果找到,则返回以0开头的特定位置。如果找不到,则返回-1
strings.Replace(str string, old string, new string, n int): 字符串替换 替换功能用字符串中的某些其他字符替换某些字符。n指定要在字符串中替换的字符数。如果n小于0,则替换次数数没有限制
strings.ToLower(str string) string: 将每个单词的所有字符转换为小写
strings.ToUpper(str string) string: 将每个单词的所有字符转换为大写
strings.Contains(s, substr string) bool: 判断字符串s是否包含子串substr。
2.15 字符串格式化
// 字符串格式化
fmt.Printf("%v", 变量名) // 打印值
fmt.Printf("%+v",变量名) // 打印字段名字和值
fmt.Printf("%#v", 变量名) // 打印结构体的完整 字段名称和值