[ Go语法基础 | 青训营笔记 ]

126 阅读5分钟

[ Go语法基础 | 青训营笔记 ]

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

前言:

语法课程和从网上资料补充的go语法笔记

一.变量

1.概念

  1. 布尔型 布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。
  2. 数字类型 整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。
  3. 字符串类型: 字符串就是一串固定长度的字符连接起来的字符序列。Go 的字符串是由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
  4. 派生类型: 包括: (a) 指针类型(Pointer) (b) 数组类型 (c) 结构化类型(struct) (d) Channel 类型 (e) 函数类型 (f) 切片类型 (g) 接口类型(interface) (h) Map 类型

2.声明变量

  • var 变量名 类型
  • var 变量名 = value//类似(c++ auto)
  • 变量名:=value
  1. 未初始化为0值,各个类型值不一,例如指针,数组,接口等,值为nli
  2. 函数里声明完变量(即局部变量)没有使用,会编译错误。

二.分支选择循环

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, lencap)
//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)
	}
}

----完结----