go语言基础语法

116 阅读12分钟

之前看的第一次课发笔记啦,正式入坑go

1.1 什么是 Go 语言 1.高性能、高并发 2.语法简单、学习曲线平缓 3.丰富的标准库 4.完善的工具链 5.静态链接 6.快速编译 7.跨平台

以下是老师在课堂上举的一个简单的Go程序,可以通过HTTP从当前目录提供文件服务。 `Context cleared package main

import "net/http"

func main() { http.Handle("/",http.FileServer(http.Dir("."))) http.ListenAndServe(":8080",nil) }` 下面就来讲解一下每一行代码的功能: 1.package main:声明这是一个main包。在Go中,一个程序需要有一个main包,并包含一个main函数才能运行。 2.import "net/http":导入net/http包,该包提供了HTTP客户端和服务器实现。 3.func main() { ... }:定义了main函数,是程序的入口点。 4.http.Handle("/",http.FileServer(http.Dir("."))):创建一个新的HTTP处理程序,可以从当前目录提供文件服务。http.Dir(".")调用返回一个新的http.Dir类型,表示当前目录。http.FileServer返回一个http.Handler,用于提供该目录的内容。然后将生成的处理程序传递给http.Handle,将其注册为根URL("/")的处理程序。 5.http.ListenAndServe(":8080",nil):启动一个HTTP服务器。

2.2 基础语法 - Hello World

下面就输出一个Hello World来进入go的世界

2.3 基础语法 - 变量

啥是变量,相信学过C语言或者其他语言的大佬都知道了。这里就浅浅给个官方一点的术语: 变量是为存储特定类型的值而提供给内存位置的名称,本质是一小块内存,用于存储数据,在程序运行过程中数值可以改变的,声明变量的一般形式是使用 var 关键字. 举个小例子: `package main import "fmt" func main() {     var a string = "goyuyan"     fmt.Println(a)

    var b, c int = 1, 2     fmt.Println(b, c) }`

2.4 基础语法 - 循环

Go 语言提供了以下几种类型循环处理语句: 1.for循环 重复执行语句块 2.循环嵌套 在for循环中嵌套一个或多个for循环 循环控制语句 1.break语句 中断for循环或者跳出Switch循环 2.continue语句 跳过当前循环的剩余语句,然后继续执行下一次循环 3.goto语句 将控制转移到被标记的语句 Go 语言的 For 循环有以下3 种形式: 第一:和C语言的for循环一样 for init; condition; post { } 第二:和C语言的while循环一样 for condition { } 第三:和C语言的for(;;)一样 for { }

2.5 基础语法 - switch

与C语言不同的是在go语言中switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough来进行穿透。 Switch的语法如下: switch var1 { case val1: ... case val2: ... default: ... } 下面是老师的例子加上网上的fallthrough:

2.6 基础语法 - 数组

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。其中数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推。 Go 语言数组声明需要指定元素类型及元素个数,语法格式如下: var arrayName [size]dataType 下面是老师上课的例子:

2.7 基础语法 - 切片

虽然Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,但是Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。其中切片不需要说明长度。 使用 make() 函数来创建切片: var slice1 []type = make([]type, len) 也可以简写为 slice1 := make([]type, len) 也可以指定容量,其中 capacity 为可选参数 make([]T, length, capacity)

len() 和 cap() 函数

切片是可索引的,并且可以由 len() 方法获取长度。 切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。

空(nil)切片

一个切片在未初始化之前默认为 nil,长度为 0

切片截取

可以通过设置下限及上限来设置截取切片  [lower-bound:upper-bound]

append() 和 copy() 函数

如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。 下面是老师上课的例子:

2.8 基础语法- map

Map 是一种无序的键值对的集合,所以我们可以像迭代数组和切片那样迭代它,因为是无序的原因, 遍历 Map 时返回的键值对的顺序是不确定的,但是他可以通过 key 来快速检索数据,key 类似于索引,指向数据的值。 在获取 Map 的值时,如果键不存在,返回该类型的零值,例如 int 类型的零值是 0,string 类型的零值是 ""。

定义 Map

可以使用内建函数 make 或使用 map 关键字来定义 Map: map_variable := make(map[KeyType]ValueType, initialCapacity) 其中 KeyType 是键的类型,ValueType 是值的类型,initialCapacity 是可选的参数,用于指定 Map 的初始容量。Map 的容量是指 Map 中可以保存的键值对的数量,当 Map 中的键值对数量达到容量时,Map 会自动扩容。如果不指定 initialCapacity,Go 语言会根据实际情况选择一个合适的值。

delete() 函数

delete() 函数用于删除集合的元素, 参数为 map 和其对应的 key 下面是老师上课举的例子:

2.9 基础语法- # Go 语言范围range

range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。 for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下: for key, value := range oldMap { newMap[key] = value } 以上代码中的 key 和 value 是可以省略。 如果只想读取 key,格式如下: for key := range oldMap 或者这样: for key, _ := range oldMap 如果只想读取 value,格式如下: for _, value := range oldMap 下面是老师上课局的例子:

2.10 基础语法 - 函数

函数是基本的代码块,用于执行一个任务。 Go 语言最少有个 main() 函数。

函数定义

Go 语言函数定义格式如下: func function_name( [parameter list] ) [return_types] { 函数体 } 下面是老师局的例子:

2.11 基础语法 - 指针

Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址,一个指针变量指向了一个值的内存地址。指针声明格式如下: var var_name *var-type

Go 空指针

当一个指针被定义后没有分配到任何变量时,它的值为 nil。 nil 指针也称为空指针。 nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。 一个指针变量通常缩写为 ptr。 以下是老师上的例子:

2.12 基础语法 - 结构体

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,在结构体中我们可以为不同项定义不同的数据类型。 定义结构体:结构体定义需要使用 type 和 struct 语句,具体格式如下: type struct_variable_type struct { member definition member definition ... member definition } 访问结构体成员,需要使用点号 . 操作符,格式如下: 结构体.成员名 下面是老师上课讲的例子:

2.13 基础语法 - 结构体方法

那么啥子是方法呢,原来,Go方法是作用在接收者(receiver)上的一个函数,接收者是某种类型(不能是接口,指针),一个结构体加上它的方法 等价于面向对象中的一个类。区别是:Go中,类型的代码和绑定在它上面的方法的代码可以不放置在一起,可以存放在不同的源文件中,但它们必须在同一个包中。 定义方法的一般格式如下: func (recv receiver_type) methodName(parameter_list)(return_value_list) {...} 下面是老师上课讲的例子:

2.14 基础语法 - 错误处理

Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error 类型是一个接口类型,这是它的定义: type error interface { Error() string } 我们可以在编码中通过实现 error 接口类型来生成错误信息。 函数通常在最后的返回值中返回错误信息。使用 errors.New 可返回一个错误信息: func Sqrt(f float64) (float64, error) { if f < 0 { return 0, errors.New("math: square root of negative number") } // 实现 } 下面举个简单例子: 下面是老师上课讲的例子:

2.15 基础语法 - 字符串操作

1.strings.Contains方法
语法:func Contains(str,substr string)bool
说明:判断字符串str中是否包含substr,返回布尔值 2.len()用来统计一个字符串的长度的(按字节统计一个中文字符在utf-8中是三个字节) 3.Count()函数 统计次数,统计一个字符串有几个指定的子串 : strings.Count(“str”, “substr”) 4. 5.strings.Index方法
语法:func Index(str,subStr string)int
说明:在str中查找subStr字符串第一次出现的下标,未能找到返回-1 6.strings.Join方法
语法:func Join(strSlice[] string, sep string) string
说明:将切片strSlice中的内容,以sep分隔符链接起来构成一个完整的字符串 7.strings.Repeat方法
语法: func Repeat(str string, count int)string
说明:将字符串str重复count次后,构成新的字符串返回,但是count不能小于0 8.strings.Replace方法 语法:func Replace(str,oldSub,newSub string, times int)string 说明:将字符串中str的oldSub替换为newSub,并构成一个新的字符串返回,对原字符串 不会造成任何影响,times表示要替换进行多少次,0表示不替换,负数表示全部替换 9.strings.Split方法 语法:func Split(str,sep string)[]string 说明:将字符串str按照sep进行分割,将分割之后的结果构成一个字符串切片返回 若无法进行分割,则将原字符串作为一个切片元素构成切片返回 本方法不会对原有的字符串造成任何影响 10.ToUpper()函数 转换大写
ToLower()函数转换小写 下面是老师上课讲的例子:

2.16 基础语法 - 字符串格式化

  1. %v 只输出原来的值
  2. %+v 先输出字段的类型,在输出该字段的值
  3. %#v 先输出结构体名字值,在输出结构体 (字段类型 + 字段的值) 下面是老师上课举的例子:

2.17 基础语法 - JSON 处理

JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。JSON由于比XML更小、更快,更易解析,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。 注意的是结构体中成员开头字母必须大写 Company stringjson:" // 表示此字段不会输出到屏幕 Age intjson:"age"// 二次编码,转为小写字母 Isok booljson:",string"// 将结果转换为字符串 json.Marshal() 编码,根据内容生成JSON文本 json.MarshalIndent() 格式化编码 下面是老师上课讲的例子:

2.18 基础语法 - 时间处理

1.获取现在时间time.Now() 2.手动构造时间-time.Date() 3.time.Format("$layout")格式化时间时, 时区会参与计算 4.从unix时间戳中构造时间, time.Unix(), 传入秒和纳秒构造. 下面是老师上课讲的例子:

2.19 基础语法 - 数字解析

从字符串解析出数字是一个基本的而且很常见的任务,Go内置的 strconv 提供了数字解析功能。 下面是老师上课举的例子:

2.20 基础语法 - 进程信息

Go语言的 os 包中提供了操作系统函数的接口,是一个比较重要的包。顾名思义,os 包的作用主要是在服务器上进行系统的基本操作,如文件操作、目录操作、执行命令、信号与中断、进程、系统状态等等。 下面是os包中的常用函数: 1.Hostname 函数定义:func Hostname() (name string, err error),Hostname 函数会返回内核提供的主机名。

2.Environ 函数定义: func Environ() []string,Environ 函数会返回所有的环境变量,返回值格式为“key=value”的字符串的切片拷贝。

3.Getenv 函数定义: func Getenv(key string) string,Getenv 函数会检索并返回名为 key 的环境变量的值。如果不存在该环境变量则会返回空字符串。

4.Setenv 函数定义: func Setenv(key, value string) error,Setenv 函数可以设置名为 key 的环境变量,如果出错会返回该错误。

5.Exit 函数定义: func Exit(code int),Exit 函数可以让当前程序以给出的状态码 code 退出。一般来说,状态码 0 表示成功,非 0 表示出错。程序会立刻终止,并且 defer 的函数不会被执行。

6.Getuid 函数定义: func Getuid() int,Getuid 函数可以返回调用者的用户 ID。

7.Getgid 函数定义: func Getgid() int,Getgid 函数可以返回调用者的组 ID。

8.Getpid 函数定义: func Getpid(). int,Getpid 函数可以返回调用者所在进程的进程 ID。

9.Getwd 函数定义: func Getwd() (dir string, err error),Getwd 函数可以返回一个对应当前工作目录的根路径。如果当前目录可以经过多条路径抵达(因为硬链接),Getwd 会返回其中一个。

10.Mkdir 函数定义: func Mkdir(name string, perm FileMode) error,Mkdir 函数可以使用指定的权限和名称创建一个目录。如果出错,会返回 *PathError 底层类型的错误。

11.MkdirAll 函数定义: func MkdirAll(path string, perm FileMode) error,MkdirAll 函数可以使用指定的权限和名称创建一个目录,包括任何必要的上级目录,并返回 nil,否则返回错误。权限位 perm 会应用在每一个被该函数创建的目录上。如果 path 指定了一个已经存在的目录,MkdirAll 不做任何操作并返回 nil。

12.Remove 函数定义: func Remove(name string) error,Remove 函数会删除 name 指定的文件或目录。如果出错,会返回 *PathError 底层类型的错误。 RemoveAll 函数跟 Remove 用法一样,区别是会递归的删除所有子目录和文件。

下面是老师上课讲的例子: