![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
GO语言
夏天匆匆2过
生于忧患死于安乐
展开
-
go语言学习总结,有源码有注释
第一章、go语言基础数据类型,01_基础数据类型1变量的声明,变量初始化,变量赋值,匿名变量,iota枚举第一章、go语言基础数据类型,02_基础数据类型2float,bool,byte,string,复数类型,格式化输出,变量的输入,类型转换,类型别名type第二章、go语言流程控制,03_流程控制if语句,switch语句,for循环,range迭代,break,continue,goto第三章、go语言函数,04_函数的使用1无参、有参,无返回值、有返回值函数的定义和使用,不定参数函数,原创 2022-03-23 14:22:11 · 1222 阅读 · 0 评论 -
第一章、go语言基础数据类型,01_基础数据类型1
变量的声明,变量初始化,变量赋值,匿名变量,iota枚举go语言以包作为管理单位每个文件必须先声明包程序必须有一个main包源代码package mainimport "fmt"//go函数可以返回多个值func test() (a, b, c int) { return 1, 2, 3}//入口函数main//一个文件夹里的文件只能有一个main函数,liteIDE是以文件夹作为工程单位管理func main() { //左括号必须和函数名同行 //hello go!打印原创 2022-03-23 12:25:12 · 114 阅读 · 0 评论 -
第一章、go语言基础数据类型,02_基础数据类型2
float,bool,byte,string,复数类型,格式化输出,变量的输入,类型转换,类型别名type源代码package mainimport "fmt"func main() { //1、bool类型 //变量声明,没有初始化,默认初始值为false var a0 bool fmt.Println("a0 = ", a0) a0 = true fmt.Println("a0 = ", a0) //自动推导类型 var b = false fmt.Println("b =原创 2022-03-23 12:23:56 · 107 阅读 · 0 评论 -
第二章、go语言流程控制,03_流程控制
if语句,switch语句,for循环,range迭代,break,continue,goto源代码package mainimport ( "fmt" "time")func main() { //1、if语句 s := "loss" //注意if语句后面的判断条件没有() if s == "rich" { fmt.Println("钱多多") } //if支持一个初始化语句,初始化语句和判断条件以分号隔开 //此时a是局部变量 if a := 10; a == 10原创 2022-03-23 12:22:37 · 123 阅读 · 0 评论 -
第三章、go语言函数,04_函数的使用1
无参、有参,无返回值、有返回值函数的定义和使用,不定参数函数,递归,回调函数源代码package mainimport "fmt"func main() { Myfunc0() Myfunc1(1001, 1002) //1001为实参 Myfunc2(1003, 1004, 1005) Myfunc3() Myfunc3(1, 2, 3) test(1, 2, 3, 4) //调用Myfunc4 h := Myfunc5() fmt.Println("h = ", h) i原创 2022-03-23 12:21:14 · 109 阅读 · 0 评论 -
第三章、go语言函数,05_函数的使用2
匿名函数,闭包,defer源代码package mainimport "fmt"func main() { a := 10 str := "mike" //1、匿名函数,没有函数名 f1 := func() { //自动推导类型 fmt.Println("a = ", a) fmt.Println("str = ", str) } f1() //匿名函数调用 //给函数类型起别名 type TestFunc0 func() var f2 TestFunc0 //声原创 2022-03-23 12:20:01 · 117 阅读 · 0 评论 -
第三章、go语言函数,06_函数的使用3.go
命令行参数,局部变量,全局变量,.操作,给包起别名,忽略包源代码package main//4、.操作// import ."fmt"//调用函数,无需通过包名//5、给包起别名//通过别名一样可以调用函数// import io "fmt"//6、忽略包//不能调用包内的函数,主要用于调用init函数// import _ "fmt"import ( "fmt" "os")//3、全局变量//定义在函数外部的变量是全局变量,全局变量在任何地方都能使用var a原创 2022-03-23 12:18:30 · 74 阅读 · 0 评论 -
第四章、go语言工程管理,07_工程管理:同级目录
1、分文件编程(多个源文件),必须放在src目录2、设置GOPATH环境变量,右键我的电脑-高级系统设置-环境变量(当前版本未设置环境变量,Ctrl+R可以正常运行)3、go env 查看go相关的环境变量4、同一级目录,包名必须一样5、同一个目录,调用别的源文件的函数,直接调用即可,不需要包名引用源代码main.gopackage mainfunc main() { test()}test.gopackage mainimport "fmt"func test() {原创 2022-03-23 12:16:56 · 141 阅读 · 0 评论 -
第四章、go语言工程管理,08_工程管理:不同目录
init函数,环境变量配置,GOPATH,GOBIN,自动生成bin目录和pkg目录1、不同目录,包名不一样2、调用不同包里面的函数,格式:包名.函数名()3、包内函数名首字母如果是小写,则表示函数私有,别的包无法调用,首字母大写表示公有,别的包才可以调用4、调用自定义包,需要配置环境变量,有两种配置方式:1>:在软件里配置,编译配置-编译目录使用自定义GOPATH-src同级目录拷贝到自定义GOPATH;这种是配置LiteIDE里面的运行环境,比如Ctrl+R运行2>:右键我的电脑原创 2022-03-23 12:14:53 · 188 阅读 · 0 评论 -
第五章、go语言复合类型,09_复合类型_指针
变量地址,指针变量,new运算符,函数的值传递和指针传递源代码package mainimport "fmt"func main() { //1、变量的地址 //每个变量都有两个属性,变量的内存和变量的地址 var a int = 10 fmt.Printf("a = %d,&a = %v\n", a, &a) //2、指针变量 //保存某个变量的地址,需要指针类型,*int保存int的地址,**int保存*int的地址 //定义一个变量p,类型为*int va原创 2022-03-22 18:13:23 · 95 阅读 · 0 评论 -
第五章、go语言复合类型,10_复合类型_数组
数组的定义,数组的初始化,二维数组,数组的比较,数组的赋值,数组做函数参数,数组指针做函数参数,随机数的生成,冒泡排序源代码package mainimport ( "fmt" "math/rand" "time")func main() { //1、定义一个数组,[10]int和[5]int是不同类型 var a [10]int var b [5]int fmt.Printf("len(a) = %d,len(b) = %d\n", len(a), len(b)) //定义原创 2022-03-22 18:11:33 · 104 阅读 · 0 评论 -
第五章、go语言复合类型,11_复合类型_切片
切片的定义,切换和数组的区别,切片的截取,切片和底层数组的关系,append函数,copy函数,切片做函数参数源代码package mainimport ( "fmt" "math/rand" "time")func main() { //1、切片的定义 //[low:high:max] //slice本质上不是数组,是一种数据结构 //low,下标的起点 //high,下标的终点(不包括此下标),[a[low],a[high]),左闭右开 //len = high - low原创 2022-03-22 18:10:13 · 108 阅读 · 0 评论 -
第五章、go语言复合类型,12_复合类型_map
map的定义,创建,初始化,遍历,删除,map做函数参数源代码package mainimport "fmt"func main() { //1、定义一个变量,类型为map[int]string var m1 map[int]string fmt.Printf("m1 = %v,len(m1) = %d\n", m1, len(m1)) //对于map,只有len,没有cap //2、使用make创建 m2 := make(map[int]string) fmt.Printf("m原创 2022-03-22 18:08:44 · 99 阅读 · 0 评论 -
第五章、go语言复合类型,13_复合类型_结构体
结构体初始化,结构体指针,结构体成员的使用,结构体比较,结构体赋值,结构体做函数参数,结构体指针做函数参数,go语言可见性规则源代码package mainimport "fmt"//定义一个结构体类型type Student struct { id int name string sex byte age int addr string}func main() { //1、结构体初始化 //顺序初始化,每个成员必须初始化 var s1 Student = Stu原创 2022-03-22 18:07:14 · 104 阅读 · 0 评论 -
第六章、go语言面向对象编程,14_面向对象_匿名字段
结构体匿名字段,基础类型匿名字段,匿名字段成员操作,结构体指针匿名字段,同名字段源代码package mainimport "fmt"/*go面向对象编程,go语言没有继承、封装、多态的概念,但可以通过别的方式实现这些特性继承:通过匿名字段实现封装:通过方法实现多态:通过接口实现*/type Person struct { name string sex byte age int}type Student struct { Person //匿名字段,只有类型,没原创 2022-03-22 18:04:47 · 110 阅读 · 0 评论 -
第六章、go语言面向对象编程,15_面向对象_方法1
Go语言实现面向对象,方法的定义,值语义,引用语义,方法集在Go语言中,可以给任意自定义类型(包括内置类型,但不包括指针类型)添加相应的方法func (receiver ReceiverType)funcNmae(parameters) (results){}方法总是绑定对象实例,并隐式将实例作为第一次实参(receiver)接收者类型的基类型不能是接口或指针不支持方法重载,不能定义名字相同但是不同参数的方法源代码package mainimport "fmt"//1、面向过程,实现2原创 2022-03-22 18:03:00 · 117 阅读 · 0 评论 -
第六章、go语言面向对象编程,16_面向对象_方法2
方法的继承、重写,方法值,方法表达式源代码package mainimport "fmt"type Person struct { name string sex byte age int}//1、方法的继承//学生结构体,继承Person字段,成员和方法都继承了type Student struct { Person //匿名字段,只有类型,没有名字,继续了Person的成员 id int addr string}//Person类型实现了一个方法原创 2022-03-22 17:58:59 · 81 阅读 · 0 评论 -
第六章、go语言面向对象编程,17_面向对象_接口
接口的定义,接口方法实现,接口实现多态,切片实现多态,接口继承,接口转换,空接口,if和switch实现类型断言源代码package mainimport "fmt"//1、定义接口类型type Humaner interface { //子集 //方法,只有声明,没有实现,由别的类型(自定义类型)实现 sayhi()}//5、接口的继承type Personer interface { //超集 Humaner //匿名字段,继承了sayhi() sing(lrc strin原创 2022-03-22 17:56:19 · 96 阅读 · 0 评论 -
第七章、go语言异常处理,18_异常处理
error:普通错误,非致命panic:无法挽回的致命错误,会导致程序崩溃recover:拦截panic错误,使程序不崩溃,并打印错误信息源代码package mainimport ( "errors" "fmt")func MyDiv(a, b int) (result int, err error) { err = nil if b == 0 { err = errors.New("分母不能为0") } else { result = a / b } return原创 2022-03-22 17:53:29 · 431 阅读 · 0 评论 -
第八章、go语言文本文件处理,19_go字符串处理
字符串操作常用函数,字符串与其他数据类型相互转换。字符串操作常用函数原型func Contains(s, substr string) bool//字符串s中是否包含substr,返回bool值func Join(a []string , sep string) string//把切片a的元素通过sep连接起来,组成新的字符串并返回func Index(s, sep string) int//在字符串s中查找sep所在的位置,返回位置值,找不到返回-1func Repeat(s string, c原创 2021-03-29 21:53:57 · 134 阅读 · 0 评论 -
第八章、go语言文本文件处理,20_go正则表达式的使用
正则表达式使用步骤:1、解析规则,它会解析正则表达式,如果成功返回解析器;2、根据规则提取关键信息。源代码import ( "fmt" "regexp")func main() { //举例1:取字符串 str1 := "abbc azc a7c aac 888 a9c tac" //解析规则 reg1 := regexp.MustCompile(`a.c`) //.表示匹配除\n外的任意字符,``反单引号表示原生字符串 // reg1 := regexp.MustCompile原创 2021-03-29 21:51:43 · 214 阅读 · 0 评论 -
第八章、go语言文本文件处理,21_go语言json的使用
结构体、map生成json,json解析到结构体、map。源代码package mainimport ( "encoding/json" "fmt")//结构体生成json,成员变量名首字母必须大写//`json:` 二次编码type IT struct { Company string `json:"company"` //指定字符串输出 Subjects []string `json:"-"` //此字段不输出 IsOk bool `json原创 2021-03-29 21:49:15 · 82 阅读 · 0 评论 -
第八章、go语言文本文件处理,22_go文件读写
标准输入输出,文件读写。源代码package mainimport ( "bufio" "fmt" "io" "os")func WriteFile(path string) { //打开文件,O_RDWR|O_CREATE|O_TRUNC file, err1 := os.Create(path) if err1 != nil { fmt.Println("err1 = ", err1) return } defer file.Close() //使用完毕,需要关闭原创 2021-03-29 21:47:26 · 108 阅读 · 0 评论 -
第九章、go语言并发编程,23_go语言goroutine的使用
goroutine创建协程,Gosched,Goexit,Goexit函数的使用。源代码package mainimport ( "fmt" "runtime" "time")func NewTask() { for { fmt.Println("this is a NewTask goroutine") time.Sleep(time.Second) //延时1s }}func GoexitTest() { defer fmt.Println("cccccccccc原创 2021-03-29 21:43:41 · 114 阅读 · 0 评论 -
第九章、go语言并发编程,24_go语言channel的使用
创建channel,channel数据读写,无缓存channel,有缓存channel,关闭channel,单向channel。源代码package mainimport ( "fmt" "time")//1、创建channel,全局变量var ch = make(chan int)var ch2 = make(chan string)//定义一个打印机,按字符打印,fmt输出到屏幕,属于公共资源func Painter(str string) { for _, data :=原创 2021-03-29 21:41:58 · 87 阅读 · 0 评论 -
第九章、go语言并发编程,25_go定时器的使用
定时器Timer创建,Timer重置,Timer停止,Ticker的使用源代码package mainimport ( "fmt" "time")func main() { //1、创建Timer //Timer定时器超时只会生效一次,生成一次事件,往channel写数据 //创建一个定时器,设置时间为2s,2s后往Timer通道写数据(数据为当前时间) timer1 := time.NewTimer(2 * time.Second) fmt.Println("当前时间:", t原创 2021-03-29 21:40:25 · 109 阅读 · 0 评论 -
第九章、go语言并发编程,26_go语言select的使用
select简介通过select可以监听channel上数据的流动select{case i:=<- chan1://如果从chan1成功读取到数据,则执行该case处理语句case chan2 <- 1://如果成功向chan2写入数据,则执行该case处理语句default://如果上面都没有成功,则进入default处理流程}1、在一个select语句中,Go语言会按顺序从头到尾评估每一个发送和接收的语句2、如果其中任意一个语句可以执行(即没有被阻塞),那么就从这些可原创 2021-03-29 21:36:10 · 96 阅读 · 0 评论 -
第十章、go语言网络编程,27_go实现TCP服务器
package mainimport ( "fmt" "net")func main() { //1、监听 listener, err1 := net.Listen("tcp", "127.0.0.1:9001") //("网络类型TCP/UDP","服务器IP:服务器端口") if err1 != nil { fmt.Println("err1 = ", err1) return } defer listener.Close() //2、阻塞等待用户连接 conn,原创 2021-03-29 21:32:32 · 107 阅读 · 0 评论 -
第十章、go语言网络编程,28_go实现TCP客户端
go实现TCP客户端package mainimport ( "fmt" "net" "os")func main() { //1、主动连接服务器 conn, err := net.Dial("tcp", "127.0.0.1:9001") //("网络类型TCP/UDP","服务器IP:服务器端口") if err != nil { fmt.Println("err = ", err) return } defer conn.Close() //main函数调用完毕,原创 2021-03-29 21:29:29 · 149 阅读 · 0 评论 -
第十章、go语言网络编程,29_go实现TCP并发服务器
实现功能:支持多个客户端连接到服务器,多个连接并发源代码package mainimport ( "fmt" "net" "strings")func HandleConn(conn net.Conn) { defer conn.Close() //函数调用完毕,自动关闭conn //获取客户端的网络地址信息 addr := conn.RemoteAddr().String() fmt.Println(addr, "connect successful") buf := m原创 2021-03-28 21:58:49 · 298 阅读 · 0 评论 -
第十章、go语言网络编程,30_go实现TCP传文件client
TCP传文件client源代码package mainimport ( "fmt" "io" "net" "os")//发送文件func SendFile(path string, conn net.Conn) { //以只读方式打开文件 file, err5 := os.Open(path) if err5 != nil { fmt.Println("os.Open err5 = ", err5) return } defer file.Close() buf原创 2021-03-28 21:55:57 · 155 阅读 · 0 评论 -
第十章、go语言网络编程,31_go实现TCP传文件server
TCP传文件server源代码package mainimport ( "fmt" "io" "net" "os")//接收文件内容func RecvFile(fileName string, conn net.Conn) { //新建文件 file, err4 := os.Create(fileName) if err4 != nil { fmt.Println("os.Create err4 = ", err4) return } buf := make([]原创 2021-03-28 21:54:57 · 107 阅读 · 0 评论 -
第十章、go语言网络编程,32_go实现http请求包格式
使用TCP写HTTP服务器,客户端(浏览器)访问HTTP服务器时的请求包格式源代码package mainimport ( "fmt" "net")func main() { //监听 listener, err1 := net.Listen("tcp", ":8000") if err1 != nil { fmt.Println("net.Listen err1 = ", err1) return } defer listener.Close() //阻塞等待用户连原创 2021-03-28 21:53:13 · 129 阅读 · 0 评论 -
第十章、go语言网络编程,33_go实现http测试服务器
启动一个http服务器,浏览器访问http://127.0.0.1:8000/go,页面打印hello go.源代码package mainimport ( "fmt" "net/http")func myHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "hello go")}func main() { http.HandleFunc("/go", myHandler) //在指定的地址进行监原创 2021-03-28 21:51:34 · 112 阅读 · 0 评论 -
第十章、go语言网络编程,34_go实现http响应包格式
TCP写客户端,连接HTTP服务器,使用请求包访问服务器,打印服务器回复的响应报文。源代码package mainimport ( "fmt" "net")func main() { //主动连接服务器 conn, err1 := net.Dial("tcp", ":8000") if err1 != nil { fmt.Println("net.Dial err1 = ", err1) return } defer conn.Close() requestBuf :原创 2021-03-28 21:50:23 · 198 阅读 · 0 评论 -
第十章、go语言网络编程,35_go实现http服务器
使用HTTP写一个web服务器,浏览器访问时显示hello go,打印客户端发送的请求包(结构体)。源代码package mainimport ( "fmt" "net/http")//w,给客户端回复数据//req,读取客户端发送的数据func HandleConn(w http.ResponseWriter, req *http.Request) { fmt.Println("req.Method = ", req.Method) //请求方法 fmt.Prin原创 2021-03-28 21:48:27 · 148 阅读 · 0 评论 -
第十章、go语言网络编程,36_go实现http客户端
实现HTTP客户端访问网址,打印响应数据源代码package mainimport ( "fmt" "net/http")func main() { // resp, err1 := http.Get("http://www.baidu.com")//数据量太大 resp, err1 := http.Get("http://127.0.0.1:8000/go.html") if err1 != nil { fmt.Println("http.Get err1 = ", err1)原创 2021-03-28 21:45:10 · 116 阅读 · 0 评论 -
第十章、go语言网络编程,37_go实现百度贴吧爬虫
创建爬虫程序,爬取百度wow贴吧指定页面全部内容,保存到本地文件,单任务源代码package mainimport ( "fmt" "net/http" "os" "strconv")func main() { var start, end int fmt.Println("请输入起始页(>=1):") fmt.Scan(&start) fmt.Println("请输入终止页(>=起始页):") fmt.Scan(&end) DoWork(st原创 2021-03-28 21:43:29 · 93 阅读 · 0 评论 -
第十章、go语言网络编程,38_go实现并发贴吧爬虫
创建爬虫程序,爬取百度wow贴吧指定页面全部内容,保存到本地文件,使用协程和管道实现多任务并发爬虫。第十章_网络编程,38_网络编程_并发贴吧爬虫源代码打印输出源代码package mainimport ( "fmt" "io" "net/http" "os" "strconv")func main() { var start, end int fmt.Println("请输入起始页(>=1):") fmt.Scan(&start) fmt.Println("原创 2021-03-28 21:40:49 · 109 阅读 · 1 评论