golang 学习文档 第一阶段学习总结

2020/7/17 7:37:13 人评论 次浏览 分类:学习教程

GO语言简介

Go语言是一个开源的编程语言,他能让构造简单、可靠且高效的软件变得荣誉。其特点主要有以下几点:

  • 简洁、快速、安全
  • 并行、有趣、开源
  • 内存管理、数组安全、编译迅速
    Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

Go语言结构

Go语言的基础组成有以下几个部分:

  • 包声明
  • 引入包
  • 函数
  • 变量
  • 语句&表达式

例如,每个程序都要写的“hello,world”:

package main

import "fmt"

func main(){
	fmt.Println("Hello,world!")
}
  • 第一行代码package main定义了包名,要求必须文件的第一行指出所属的包名,main表示一个可执行程序,每一个Go语言程序都包含一个main包,类似于每一个C语言程序都必须有一个main函数
  • 第二行是声明这个程序所需要的包名(fmt包可以提供格式化的IO函数)
  • 第三行代码是声明函数,这里声明的是主函数,也是比不可少的,和C语言的主函数是一个原理,一般作为程序最先开始执行的函数,但是当存在init()函数时先执行init函数
  • 第四行是语句&表达式部分,在稍后我会详细总结
  • 这里有一个非常有趣的设置,当标识符以一个大写字母开头时,如Map,Array,那么这种格式的标识符的对象就可以被外部包的代码所使用,这被称为导出(类似于面向对象的语言中public);标识符如果小写字母开头,则外部包不可见,但是整个包内还是可以正常调用的。

Go语言的基本语法与执行

Go语言基础

Go语言每一条语句完成的标志

  • 每一个语句结束的表示是换行,也就是说不再需要在每一行的末尾加上分号

Go语言变量及其赋值

  • 对变量的声明“var”关键字,可以一次声明多个变量
    var a b string
    以上语句是声明a,b为string类型的变量

  • 对变量的赋值是非常方便的,以下是三种赋值方式:

var a int
a = 1
var a = 1
a := 1

第一种和第二种使用没有什么要求,如果先声明变量类型后来才去赋值的话,在声明变量的时候要指出其数据类型,如果直接声明并且赋值的话,变量类型会根据所赋值的类型赋予变量,

第三种的使用范围相对来说比较小,虽然这是使用变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值。使用操作符 := 可以高效地创建一个新的变量,称之为初始化声明。

  • 关于匿名变量
    匿名变量使用“_”来表示,这个标识符叫做空白标识符。
  • 注意事项
    如果在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明,例如:a := 20 就是不被允许的,编译器会提示错误 no new variables on left side of :=,但是 a = 20 是可以的,因为这是给相同的变量赋予一个新的值。如果你声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误。

Go语言常量

Go语言中的常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式。

常量的值必须是能够在编译时就能够确定的,可以在其赋值表达式中涉及计算过程,但是所有用于计算的值必须在编译期间就能获得。

关于iota
当使用const关键字对某几个变量进行赋值的时候,例如以下代码,即从值a为零的行索引。

const (
    a = iota
    b
    c
)

Go语言指针

和C语言中的指针一样,都是用来存放一个地址的,指针的值就是指针指向的值的地址。

Go程序的执行

我使用的编译器是vscode,具体教程各处都有,我就不做详细的说明了,那么怎么去运行程序呢,首先vscode可以使用Ctrl+F5进行执行,但是如果使用的不是vscode该怎么办,还有一种方式:打开命令行,并进入程序文件保存的目录中,输入命令go run [文件名]

Go语言容器

数组与多维数组

数组是每个语言所必备的数据结构,也是最基础的数据结构

//两种创建数组的方式
var arr1[] int//[]中填数组长度,可以不填
arr2 := make([]int , n)//n为数组长度

//两种遍历数组的方式
for i := 0; i<len(arr1);i++{
	fmt.Println("%d\n",arr1[i])
}
for _, v := range arr2{
	fmt.Println("%d\n",v)//如果需要输出索引,就把下划线换为i,并输出
}

二维数组就是数组里面所存的变量是一个新的数组

//两种创建二维数组的方式
var arr1[][] int
arr2 := make([][]int,m)
//遍历
for i := 0; i<len(arr1);i++{
	for j := 0; j<len(arr1[i]);j++{
		fmt.Println("%d\n",arr1[i][j])
	}
}
for _, i := range arr2{
	for _, v := range i{
		fmt.Println("%d\n",v)
	}
}

Go语言切片与range关键字

切片slice
切片默认指向一段连续内存区域,可以是数组,也可以是切片本身。

从连续内存区域生成切片是常见的操作,格式如下:
slice [开始位置 : 结束位置]

语法说明如下:

  • slice:表示目标切片对象;
  • 开始位置:对应目标切片对象的索引;
  • 结束位置:对应目标切片的结束索引。

从数组生成切片,代码如下:

var a  = [3]int{1, 2, 3}
fmt.Println(a, a[1:2])

其中 a 是一个拥有 3 个整型元素的数组,被初始化为数值 1 到 3,使用 a[1:2] 可以生成一个新的切片,代码运行结果如下:

[1 2 3]  [2]

其中 [2] 就是 a[1:2] 切片操作的结果。

从数组或切片生成新的切片拥有如下特性:

  • 取出的元素数量为:结束位置 - 开始位置;
  • 取出元素不包含结束位置对应的索引,切片最后一个元素使用 slice[len(slice)] 获取;
  • 当缺省开始位置时,表示从连续区域开头到结束位置;
  • 当缺省结束位置时,表示从开始位置到整个连续区域末尾;
  • 两者同时缺省时,与切片本身等效;
  • 两者同时为 0 时,等效于空切片,一般用于切片复位。

根据索引位置取切片 slice 元素值时,取值范围是(0~len(slice)-1),超界会报运行时错误,生成切片时,结束位置可以填写 len(slice) 但不会报错。

append()向切片中添加元素

a = append ( [位置] , [值] )

切片的复制
copy() 函数的使用格式如下:

copy( destSlice, srcSlice []T) int

其中 srcSlice 为数据来源切片,destSlice 为复制的目标(也就是将 srcSlice 复制到 destSlice),目标切片必须分配过空间且足够承载复制的元素个数,并且来源和目标的类型必须一致,copy() 函数的返回值表示实际发生复制的元素个数。

range关键字

一般用于for循环中,类似于java中for(int num : nums)循环,在Go中表示为:for _ , v :=range nums让v每次等于nums中一个元素(按索引向下传)一直到nums中元素索引到最后。

Go语言map(映射)

map就类似于java中的hashmap,是拥有key和value两个值的键值对,key相当于数据索引,value相当于值,key是不可重复的,创建时:

map1 := make(map[int]int)//括号里是值的类型,外面是键。
//遍历时操作
for k, v := range mp1{
	fmt.Println("%d->%d\t",k,v)//此时遍历的是键和值,不需要遍历另一个时将变量名改为“_”
}
//判断是否存在某个值
if -,ok := map1[v]; ok{
	fmt.Println("Exists.")
}
delete(map1, key)//删除某个键

Go语言list

新建一个列表:

list1 = list.new()

list列表的方法:
list方法

未完待续

相关资讯

    暂无相关的资讯...

共有访客发表了评论 网友评论

验证码: 看不清楚?
    -->