
Golang基础
Golang
NGC_2070
纸上得来终觉浅,绝知此事要躬行!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Golang 学习参考网址(待续)
【置顶】Go语言学习之路/Go语言教程 | 李文周的博客 https://gitee.com/moxi159753/LearningNotes/tree/master/Golang转载 2021-10-20 16:32:21 · 339 阅读 · 0 评论 -
Go 反射案例实践
反射案例实践使用反射来遍历结构体的字段,调用结构体的方法,并获取结构体标签的值案例实践所需要的参考知识func (Value)NumMethodfunc (v Value) NumMethod() int返回v持有值的方法集的方法数目。func (Value)Methodfunc (v Value) Method(i int) Value返回v持有值类型的第i个方法(默认从0开始)的已绑定(到v的持有值的)状态的函数形式的Value封装。 返回值调用Call方法...原创 2020-07-06 21:02:35 · 364 阅读 · 0 评论 -
Go 反射的注意事项和细节
反射的注意事项和细节reflect.Value.Kind获取变量的类别,返回的是一个常量func (Value)Kindfunc (v Value) Kind() KindKind返回v持有的值的分类,如果v是Value零值,返回值为InvalidtypeKindtype Kind uintKind代表Type类型值表示的具体分类。零值表示非法分类。const ( Invalid Kind = iota Bool Int Int8..原创 2020-07-06 20:09:38 · 314 阅读 · 0 评论 -
Go 反射使用的典型案例
反射的使用及案例演示 案例1: 请编写一个案例,演示对(基本数据类型、interface{}、reflect.Value)进行反射的基本操作 package mainimport ( "reflect" "fmt")//演示反射func reflectTest01(b interface{}) { //通过反射获取的传入的变量的 type , kind, 值 //1. 先获取到 reflect.Type rTyp := reflect.TypeOf(b) fmt.P原创 2020-07-06 19:22:12 · 636 阅读 · 0 评论 -
Go 反射的概念及相关函数的转换
引出反射先看一个问题,反射的使用场景type Monster struct { Name string `json:"monster_name"` -- 反射机制 Age int `json:"monster_age"` Birthday string //.... Sal float64 Skill string}使用反射机制,编写函数的适配器, 桥连接 要求如下: 定义了两个匿名函数 test1 := func(v1 int, v2 int){.原创 2020-07-06 18:02:54 · 337 阅读 · 0 评论 -
Go 管道的注意事项和使用细节
管道的注意事项和使用细节channel 可以声明为只读,或者只写性质-- 1. 在默认情况下下,管道是双向var chan1 chan int //可读可写 -- 2 声明为只写var chan2 chan<- intchan2 = make(chan int, 3)chan2<- 20//num := <-chan2 //errorfmt.Println("chan2=", chan2)-- 3. 声明为只读var chan3 <-chan int原创 2020-07-06 15:54:41 · 1022 阅读 · 0 评论 -
Go 管道阻塞的机制及协程求素数
管道阻塞的机制案例:intChan := make(chan int, 10)exitChan := make(chan bool, 1) go writeData(intChan)go readData(intChan, exitChan)for { _, ok := <-exitChan if !ok { break }}问题:如果注销掉 go readData(intChan, exitChan),程序会怎么样? 答:如果只是向管道写入数据,而没有读取,就会原创 2020-07-06 14:28:37 · 697 阅读 · 0 评论 -
Go goroutine和channel结合使用案例
goroutine和channel结合使用案例应用案例请完成goroutine和channel协同工作的案例,具体要求: 1)开启一个writeData协程,向管道intChan中写入50个整数. 2)开启一个readData协程,从管道intChan中读取writeData写入的数据。 3)注意:writeData和readDate操作的是同一个管道 4)主线程需要等待writeData和readDate协程都完成工作才能退出 示意图:代码实现:package ma原创 2020-07-06 13:08:53 · 479 阅读 · 0 评论 -
Go channel的关闭与遍历
channel的关闭与遍历channel 的关闭 使用内置函数 close 可以关闭 channel, 当 channel 关闭后,就不能再向 channel 写数据了,但是仍然可以从该 channel 读取数据 funcclosefunc close(c chan<- Type)内建函数close关闭信道,该通道必须为双向的或只发送的。它应当只由发送者执行,而不应由接收者执行,其效果是在最后发送的值被接收后停止该通道。 在最后的值从已关闭的信道中被接收后,任何对其的接收.原创 2020-07-06 12:42:55 · 1007 阅读 · 0 评论 -
Go channel的使用细节及案例
channel的使用细节channel 使用的注意事项 1) channel 中只能存放指定的数据类型 2) channle 的数据放满后,就不能再放入了 3) 如果从 channel 取出数据后,可以继续放入 4) 在没有使用协程的情况下,如果 channel 数据取完了,再取,就会报 dead lock 读写 channel 案例演示创建一个intChan,最多可以存放3个int,演示存3数据到intChan,然后再取出这三个int创建一个mapChan,最多可原创 2020-07-06 10:24:47 · 800 阅读 · 0 评论 -
Go channel基本概念及使用
channel基本概念及使用为什么需要 channel 1) 前面使用全局变量加锁同步来解决 goroutine 的通讯,但不完美 2) 主线程在等待所有 goroutine 全部完成的时间很难确定,这里设置 10 秒,仅仅是估算。 3) 如果主线程休眠时间长了,会加长等待时间,如果等待时间短了,可能还有 goroutine 处于工作状态,这时也会随主线程的退出而销毁 4) 通过全局变量加锁同步来实现通讯,也并不利用多个协程对全局变量的读写操作。 5) 上面种种分析都在呼唤一个新的原创 2020-07-06 10:03:07 · 952 阅读 · 0 评论 -
Go 协程并发(并行)资源竞争问题及全局互斥锁
协程并发(并行)资源竞争问题先看需求 需求:现在要计算 1-200 的各个数的阶乘,并且把各个数的阶乘放入到 map 中。最后显示出来。 要求使用 goroutine 完成 分析思路: 1) 使用 goroutine 来完成,效率高,但是会出现并发/并行安全问题. 2) 这里就提出了不同 goroutine 如何通信的问题 代码实现 1) 使用 goroutine 来完成(看看使用 gorotine 并发完成会出现什么问题? 然后去解决) 2) 在运行某个程序时,如何.原创 2020-07-05 22:18:57 · 1156 阅读 · 0 评论 -
Go goroutine 的调度模型及设置运行CPU数目
goroutine 的调度模型MPG 模式基本介绍M:操作系统的主线程(是物理线程) P:协程执行需要的上下文环境 G:协程MPG 模式运行的状态 1当前程序有三个M,如果三个M都在一个cpu运行,就是并发,如果在不同的cpu运行就是并行 M1,M2,M3正在执行一个G,M1的协程队列有三个,M2的协程队列有3个,M3协程队列有2个 从上图可以看到:Go的协程是轻量级的线程,是逻辑态的,Go可以容易的起上万个协程。 其它程序c/java的多线程,往往是内核态的,比较重量级,原创 2020-07-05 21:37:20 · 1132 阅读 · 0 评论 -
Go go协程和go主线程
go协程和go主线程Go 主线程(有程序员直接称为线程/也可以理解成进程): 一个 Go 线程上,可以起多个协程,可以这样理解,协程是轻量级的线程[编译器做优化]。 Go 协程的特点 1) 有独立的栈空间 2) 共享程序堆空间 3) 调度由用户控制 4) 协程是轻量级的线程 演示案例请编写一个程序,完成如下功能: 1) 在主线程(可以理解成进程)中,开启一个 goroutine, 该协程每隔 1 秒输出 "hello,world" 2) 在主线程..原创 2020-07-05 19:35:12 · 1766 阅读 · 0 评论 -
Go goroutine的引出及基本介绍
goroutine的引出goroutine-看一个需求 需求:要求统计 1-9000000000 的数字中,哪些是素数? 分析思路: 1) 传统的方法,就是使用一个循环,循环的判断各个数是不是素数。[很慢] 2) 使用并发或者并行的方式,将统计素数的任务分配给多个 goroutine 去完成,这时就会使用到goroutine[速度提高 4 倍] goroutine的基本介绍进程和线程介绍 进程就是程序程序在操作系统中的一次执行过程,是系统进行资源分配和调.原创 2020-07-05 19:16:12 · 295 阅读 · 0 评论 -
Go 单元测试综合案例
单元测试综合案例单元测试综合案例要求: 编写一个Monster结构体,字段Name,Age,Skill 给Monster绑定方法Store,可以将一个Monster变量(对象),序列化后保存到文件中 给Monster绑定方法ReStore,可以将一个序列化的Monster,从文件中词取,并反序列化为Monster对象,检查反序列化,名字正确 编程测试用例文件store_test.go,编写测试用例函数TestStore和TestRestore进行测试。 案例演示monst原创 2020-07-05 18:39:15 · 778 阅读 · 0 评论 -
Go 单元测试细节说明
单元测试细节说明测试用例文件名必须以 _test.go 结尾。 比如 cal_test.go , cal 不是固定的。 测试用例函数必须以 Test 开头,一般来说就是 Test+被测试的函数名 比如 TestAddUpper TestAddUpper(t *tesing.T) 的形参类型必须是 *testing.T一个测试用例文件中,可以有多个测试用例函数 比如 TestAddUpper、TestSub 运行测试用例指令 (1) cmd>go test ..原创 2020-07-05 17:55:03 · 368 阅读 · 0 评论 -
Go 单元测试的引出及应用
单元测试的引出先看一个需求 在我们工作中,我们会遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确 如:传统的方式来进行测试 在 main 函数中,调用 addUpper 函数,看看实际输出的结果是否和预期的结果一致 如果一致,则说明函数正确,否则函数有错误,然后修改错误 package mainimport ( _ "fmt")//一个被测试函数func addUpper(n int) int { res := 0 for i := 1;原创 2020-07-05 16:50:58 · 247 阅读 · 0 评论 -
Go 反序列化概念和应用
反序列化概念和应用基本介绍 json 反序列化:将 json 字符串反序列化成对应的数据类型(比如结构体、map、切片)的操作 funcUnmarshal func Unmarshal(data []byte, v interface{}) error 详见:https://studygolang.com/pkgdoc 应用案例 这里我们介绍一下将 json 字符串反序列化成结构体、map 和切片 案例1:将json字符串,反序列化成struct/定义一个结构.原创 2020-07-05 16:00:11 · 225 阅读 · 0 评论 -
Go Json序列化
Json的序列化介绍 json 序列化:将有 key-value 结构的数据类型(比如结构体、map、切片)序列化成 json 字符串的操作。 应用案例 这里介绍一下结构体、map 和切片的序列化,其它数据类型的序列化类似。 funcMarshalfunc Marshal(v interface{}) ([]byte, error)详见文档:https://studygolang.com/pkgdoc演示案例1: 结构体序列化 //定义一个结构体type.原创 2020-07-05 15:13:11 · 876 阅读 · 0 评论 -
Go Json的概念,应用场景、格式和在线解析
Json的概念 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。 JSON是在2001年开始推广使用的数据格式,目前已经成为主流的数据格式。 JSON易于机器解析和生成,并有效地提升网络传输效率,通常程序在网络传输时会先将数据(结构体、map等)序列化成json字符串,到接收方得到json字符串时,在反序列化恢复成原来的数据类型(结构体、map等)。这种方式已然成为各个语言的标准。 应原创 2020-07-05 14:47:57 · 358 阅读 · 0 评论 -
Go flag 包用来解析命令行参数
flag 包用来解析命令行参数说明: 前面的方式是比较原生的方式,对解析参数不是特别的方便,特别是带有指定参数形式的命令行。 比如:cmd>main.exe -f c:/aaa.txt -p 200 -u root 这样的形式命令行,go 设计者给我们提供了 flag包,可以方便的解析命令行参数,而且参数顺序可以随意package mainimport ( "fmt" "flag")func main() { //定义几个变量,用于接收命令行的参数值 va原创 2020-07-05 14:04:50 · 284 阅读 · 0 评论 -
Go 命令行参数基本使用
命令行参数基本使用看一个需求 我们希望能够获取到命令行输入的各种参数,该如何处理? 如图:=> 命令行参数 基本介绍 os.Args 是一个 string 的切片,用来存储所有的命令行参数 演示案例: 请编写一段代码,可以获取命令行各个参数 package mainimport ( "fmt" "os")func main() { fmt.Println("命令行的参数有", len(os.Args)) //遍历os.Args切片,就可以得原创 2020-07-05 13:38:08 · 413 阅读 · 0 评论 -
Go 统计不同类型的字符个数
统计不同类型的字符个数统计一个文件中含有的英文、数字、空格及其它字符数量package mainimport ( "fmt" "os" "io" "bufio" )//定义一个结构体,用于保存统计结果type CharCount struct { ChCount int // 记录英文个数 NumCount int // 记录数字的个数 SpaceCount int // 记录空格的个数 OtherCount int // 记录其它字符的个数}func main()原创 2020-07-05 00:15:32 · 795 阅读 · 0 评论 -
Go 拷贝文件(图片视频音频)
拷贝文件(图片视频音频)拷贝文件funcCopy(io包)func Copy(dst Writer, src Reader) (written int64, err error)将src的数据拷贝到dst,直到在src上到达EOF或发生错误。 返回拷贝的字节数和遇到的第一个错误。 对成功的调用,返回值err为nil而非EOF,因为Copy定义为从src读取直到EOF,它不会将读取到EOF视为应报告的错误。 如果src实现了WriterTo接口,本函数会调用src.WriteTo(.原创 2020-07-05 00:04:42 · 845 阅读 · 0 评论 -
Go 判断文件或目录是否存在
判断文件或目录是否存在funcStatfunc Stat(name string) (fi FileInfo, err error)Stat返回一个描述name指定的文件对象的FileInfo。 如果指定的文件对象是一个符号链接,返回的FileInfo描述该符号链接指向的文件的信息,本函数会尝试跳转该链接。 如果出错,返回的错误值为*PathError类型。golang判断文件或文件夹是否存在的方法为使用os.Stat() 函数返回的错误值进行判断: 如果返回的错误为nil,..原创 2020-07-04 22:04:44 · 3843 阅读 · 0 评论 -
Go 写文件操作及四种方式
写文件操作funcOpenFilefunc OpenFile(name string, flag int, perm FileMode) (file *File, err error)OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。 它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。const ( O_RDONLY int = syscall.O_RDONLY 只读模式打开文件 .原创 2020-07-04 21:52:47 · 1683 阅读 · 0 评论 -
Go 带缓冲的Reader读文件、一次性读取文件
带缓冲的Reader读文件读取文件的内容并显示在终端(带缓冲区的方式),使用 os.Open, file.Close, bufio.NewReader(),reader.ReadString 函数和方法 案例演示:package mainimport ( "fmt" "os" "bufio" "io" )func main() { file , err := os.Open("d:/test.txt") if err != nil { fmt.Println("o原创 2020-07-04 20:46:50 · 1981 阅读 · 0 评论 -
Go 文件的基本介绍、打开与关闭文件
文件的基本介绍文件的概念 文件,对我们并不陌生,文件是数据源(保存数据的地方)的一种,比如大家经常使用的 word 文档,txt 文件,excel 文件...都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音... 输入流和输出流 文件在程序中是以流的形式来操作的。 流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据源(文件)到程序(内存)的路径 输出流:数据从程序(内存)到数据源(文件)的路径os.File 封装所有文件原创 2020-07-04 20:21:40 · 2603 阅读 · 0 评论 -
Go 类型断言的实践案例(含类型推断函数实现)
类型断言的实践案例 案例1 在前面的 Usb 接口案例做改进: 给 Phone 结构体增加一个特有的方法 call(),当 Usb 接口接收的是 Phone 变量时,还需要调用 call方法 package mainimport ( "fmt")//声明/定义一个接口type Usb interface { //声明了两个没有实现的方法 Start() Stop()}type Phone struct { name string} //让Pho.原创 2020-07-04 18:53:02 · 497 阅读 · 0 评论 -
Go 类型断言引出和基本使用
类型断言引出和基本使用引例: 需求:如何将一个接口变量,赋给自定义类型的变量.=>引出类型断言 type Point struct { x int y int}func main() { var a interface{} var point Point = Point{1, 2} a = point //oK -- 如何将 a 赋给一个Point变量? var b Point -- b = a 不可以 b = a.(Point) -- 可以 fmt.Prin原创 2020-07-04 18:31:26 · 268 阅读 · 0 评论 -
Go 面向对象编程之多态
面向对象编程之多态基本介绍 变量(实例)具有多种形态。面向对象的第三大特征,在 Go 语言,多态特征是通过接口实现的。 可以按照统一的接口来调用不同的实现。这时接口变量就呈现不同的形态。 在前面的 Usb 接口案例,Usb usb ,既可以接收手机变量,又可以接收相机变量,就体现了 Usb 接口多态特性。 详见:Go 接口(interface)的基本介绍、特点及语法说明接口体现多态的两种形式多态参数 在前面的 Usb 接口案例,Usb usb ,即可以接收手机变量,又原创 2020-07-04 18:13:42 · 263 阅读 · 0 评论 -
Go 实现接口和继承比较
实现接口和进程比较代码说明: 继承: //Monkey结构体type Monkey struct { Name string}func (this *Monkey) climbing() { fmt.Println(this.Name, " 生来会爬树..")}//LittleMonkey结构体type LittleMonkey struct { Monkey //继承}func main() { //创建一个LittleMonkey 实例 monkey原创 2020-07-04 18:01:07 · 675 阅读 · 0 评论 -
Go 接口案例练习与实践
接口案例详解演示案例1: 下面代码是否正确: 上面d代码正确。演示案例2: 下面代码是否正确: 演示案例3: 下面代码是否正确: 接口编程的实践 实现对 Hero 结构体切片的排序: sort.Sort(data Interface) type Interface interface { // Len方法返回集合中的元素个数 Len() int // Less方法报告索引i的元素是否比索引j...原创 2020-07-04 15:30:12 · 561 阅读 · 0 评论 -
Go 接口应用场景、注意事项和使用细节
接口应用场景注意事项和使用细节接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)type Stu struct { Name string}func (stu Stu) Say() { fmt.Println("Stu Say()")}type AInterface interface { Say()}func main() { var stu Stu //结构体变量,实现了 Say() 实现了 AInterface .原创 2020-07-04 14:03:35 · 1265 阅读 · 0 评论 -
Go 接口(interface)的基本介绍、特点及语法说明
接口(interface)的基本介绍特点及语法说明基本介绍 在学习多态前,需要先了解接口(interface),因为在 Golang 中 多态特性主要是通过接口来体现的。 为什么有接口usb插槽就是现实中的接口。 你可以把手机,相机,u盘都插在usb插槽上,而不用担心那个插槽是专门插哪个的,原因是做usb插槽的厂家和做各种设备的厂家都遵守了统一的规定包括尺寸,排线等等。 这样的设计需求在 Golang 编程中也是会大量存在的。案例演示package mainimport (原创 2020-07-04 13:07:44 · 492 阅读 · 0 评论 -
Go 继承的深入讨论以及多继承
继承的深入讨论结构体可以使用嵌套匿名结构体所有的字段和方法 首字母大写或者小写的字段、方法,都可以使用。 type A struct { Name string age int}func (a *A) SayOk() { fmt.Println("A SayOk", a.Name)}func (a *A) hello() { fmt.Println("A hello", a.Name)}type B struct { A}func main() { va原创 2020-07-04 09:17:07 · 713 阅读 · 0 评论 -
Go 面向对象编程之继承
面向对象编程之继承看一个问题,引出继承的必要性 一个小问题,看个学生考试系统的程序 ,提出代码复用的问题 package mainimport ( "fmt")//编写一个学生考试系统//小学生type Pupil struct { Name string Age int Score int}//显示他的成绩func (p *Pupil) ShowInfo() { fmt.Printf("学生名=%v 年龄=%v 成绩=%v\n", p.Nam原创 2020-07-04 00:00:36 · 270 阅读 · 0 评论 -
Go 面向对象编程之封装
面向对象编程三大特性之封装基本介绍Golang 仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它 OOP 语言不一样,下面进行详细的讲解 Golang 的三大特性是如何实现的。 封装介绍 封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作 封装的理解和好处 隐藏实现细节 提可以对数据进行验证,保证安全合理(比如Age)原创 2020-07-03 20:34:30 · 839 阅读 · 0 评论 -
Go 面向对象编程思想-抽象
面向对象编程思想-抽象抽象的介绍我们在前面去定义一个结构体时候,实际上就是把一类事物的共有的属性(字段)和行为(方法)提取出来,形成一个物理模型(结构体)。这种研究问题的方法称为抽象。案例演示package mainimport ( "fmt")//定义一个结构体Accounttype Account struct { AccountNo string Pwd string Balance float64}//方法//1. 存款func (account原创 2020-07-03 19:54:38 · 402 阅读 · 0 评论