[ Go语法基础 | 青训营笔记 ]
这是我参与「第五届青训营 」笔记创作活动的第1天
前言:
语法课程和从网上资料补充的go语法笔记
一.变量
1.概念
- 布尔型 布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。
- 数字类型 整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。
- 字符串类型: 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
- 派生类型: 包括: (a) 指针类型(Pointer) (b) 数组类型 (c) 结构化类型(struct) (d) Channel 类型 (e) 函数类型 (f) 切片类型 (g) 接口类型(interface) (h) Map 类型
2.声明变量
- var 变量名 类型
- var 变量名 = value//类似(c++ auto)
- 变量名:=value
- 未初始化为0值,各个类型值不一,例如指针,数组,接口等,值为nli
- 函数里声明完变量(即局部变量)没有使用,会编译错误。
二.分支选择循环
1.if-else
if-else
if 条件{
}
else if 条件{
}
else{
}
2.switch
switch
switch 条件(可选){
case 条件:
...
default:
}
switch与c的switch不一样,不用在case后面加break。功能强大,可以替换if-else语句
3.循环
for
for 条件{
}
与c和c++的for循环类似,但是它和python一样,它可以遍历range和其他结构,功能强大。单独一个for与while一样,可以说for是个万金油。
三.数据类型及操作
1. slice(切片)
其实这个东西是python数组和c++vector的组合体,本质上是一个动态数组。它是对数组的抽象,具有高灵活性。
1.1 定义
var identifier []type
//[]没有定义大小的数组处理为切片
or
变量 := make([]type, len,cap)
//len,cap为可选参数,为长度和容量
name:=已有的slice[startindex:endindex]
//可以创造新的切片。这里就是他灵活的地方,可以媲美python的数组操作。
1.2 操作
| 函数 | 参数 | 作用 |
|---|---|---|
| copy | (slice1,sliece2) | 复制slice2到slice1 |
| append | (slice,cap) | 使slice扩容到cap |
| sort.ints | (slice) | 排序 |
2.range
在go中作为关键字存在,是一个万金油。它可以在for中迭代数组,map等结构,返回key和value。注意,循环时是值拷贝,修改元素的值并不会更改 eg.
2.1 迭代数组
package main
import (
"fmt"
)
func main() {
var a = []int{2, 3, 4, 5, 6}
for k, v := range a {
fmt.Printf("%d ", k)
fmt.Printf("%d\n", v)
}
}
2.2 迭代字符串
package main
import (
"fmt"
)
func main() {
for k, v := range "Hello,world" {
fmt.Printf("%d ", k)
fmt.Printf("%c\n", v)
}
}
2.3 迭代结构体数组
package main
import (
"fmt"
)
func main() {
type book struct {
name string
money int
}
a := []book{
{"apple", 20},
{"LOVE", 52},
}
for k, v := range a {
fmt.Printf("%d ", k)
fmt.Println(v)
}
}
3.数组
- 定义
var name[size] 类型
//注意size=0为切片
//初始化 写法
变量名:=[]类型{}
其他操作和C一样,这里不过多赘述。
4.结构体
4.1定义
type 结构体名 struct{
name 类型
...
}
4.2访问结构体成员
//和c语言一样,用过.访问
例如:book.name
4.3函数传参
和c语言一样,结构体的传参没有区别 1.传进整个结构体 2.结构体指针
4.4结构体方法
和c一样,我理解成c++的一个类,里面有成员函数。
定义方法: func (结构体)函数名(传入参数)返回参数 //和函数定义不同的是,它在函数名前面加上结构体名。
eg.
package main
import (
"fmt"
)
type stu struct {
name string
id int
}
func (a stu) getname() string {
return a.name
}
func (a *stu) turnname(s string) {
a.name = s
}
func main() {
s1 := stu{"Zh", 23}
fmt.Println(s1)
fmt.Println(s1.getname())
s1.turnname("jj")
fmt.Println(s1)
}
老生常谈的问题,函数里如何修改变量值。值拷贝显然不行。c++里可以通过引用传入,go则是和c一样,用指针的方法。
5.字符串
字符串和c++类似,这里补充一下格式化输出和类型转换。c++针对string有一套函数,go也不例外。
5.1 格式化输出
printf与c一样,没有什么好讲,但是它新增了一个万能的格式%v,它可以打印任意类型值。
- %+v:详细值
- %#v:更加详细的值。
5.2 类型转换
转换函数都在strconv这个包下,使用需要import 函数如下(字符串转数字/数字转字符串)
| 函数 | 参数 | 功能 | 返回 |
|---|---|---|---|
| Parseint | (变量,进制,位制) | 字符串转x位int | 两个值,数字和错误信息,错误返回error |
| Parsefloat | (变量,位制) | 字符串转x位float | 两个值,数字和错误信息,错误返回error |
| Atoi | (变量) | 字符串转int | 两个值,数字i和错误信息,错误返回error |
| itoA | (变量) | 数字转字符串 | 两个值,数字和错误信息,错误返回error |
5.3 操作
关于字符串的函数有很多,这里列举比较常用的。有些函数来源于strings包,需要先导入
len() - func len(v Type) int
strings.count() - func Count(s, sep string) int
strings.contains() - func Contains(s, substr string) bool
stirngs.index() - func Index(s, sep string) int
strings.ToLower() - func ToLower(s string) string
strings.ToUpper() - func ToUpper(s string) string
strings.split() - func Split(s, sep string) []string
eg.
package main
import (
"fmt"
"strings"
)
func main() {
a := "SStrHTg"
b := "scrw"
s := "1,2,3,4,5"
fmt.Println(strings.ToLower(a))
fmt.Println(strings.ToUpper(b))
fmt.Println(len(a))
fmt.Println(strings.Count(a, "s"))
fmt.Println(strings.Contains(a, "P"))
fmt.Println(strings.Split(s, ","))
fmt.Println(strings.Index(a, "tr"))
}
/*
sstrhtg
SCRW
7
0
false
[1 2 3 4 5]
2
*/
6.指针
相较于c、c++的指针,go的指针一般用于传入参数值的修改。而内存管理,go不用我们用指针去搞,省去了许多麻烦。
7.map
在很多语言里非常常见,字典,哈希表。它是一个无序的key/value对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value。
7.1定义:
var name map[key_data_type]value_data_type
or
name := make(map[string]int)
or
name := map[string]int{
"alice": 31,
}
7.2操作
增加,更改,查找
value下标访问,吗,没有值就自动增加这个值
name["sre"]=1
删除
delete(map_name, "string")
7.3迭代
使用range的for循环
package main
import (
"fmt"
)
func main() {
a := make(map[int]string)
a[0] = "z"
a[1] = "h"
for i, v := range a {
fmt.Println(i)
fmt.Println(v)
}
}
----完结----