go
文章平均质量分 84
go go go
Sunny_Future
微笑面对人生。
展开
-
内存堆栈和数据结构堆栈
内存堆栈和数据结构堆栈1、内存堆栈内存管理中的堆栈,其实应该分为“堆heap”和“栈stack”两个部分,即heap采用了堆的数据结构,栈采用了栈的数据结构,**在内存管理中发挥不同的作用。以变量存储为例:变量的引用存储在栈区中该引用所指向的变量的值则存储在堆区中2、数据结构堆栈数据结构中的stack我们叫做堆栈,其实是两种不同的数据结构,即堆和栈,堆实质上是满足一定性质的完全二叉树,而栈是“后进先出”的一种线性数据结构,它们与队列queue数据结构相对,queue是先进先出的线性数据结构原创 2021-08-21 22:27:12 · 1503 阅读 · 0 评论 -
Goroutine通道通信channel
1、channel 简介协程是独立执行的,他们之间没有通信。他们必须通信才会变得更有用:彼此之间发送和接收信息并且协调/同步他们的工作。协程可以使用共享变量来通信,但是很不提倡这样做,因为这种方式给所有的共享内存的多线程都带来了困难。而 Go 有一种特殊的类型,通道(channel),就像一个可以用于发送类型化数据的管道,由其负责协程之间的通信,从而避开所有由共享内存导致的陷阱;这种通过通道进行通信的方式保证了同步性。数据在通道中进行传递:在任何给定时间,一个数据被设计为只有一个协程可以对其访问,所以不原创 2021-08-19 21:53:26 · 504 阅读 · 0 评论 -
Goroutine 协程、WaitGroup阻塞、runtime.GOMAXPROCS
1、并发相关回顾1.1 进程、线程、协程进程:进程是系统进行资源分配的基本单位,有独立的内存空间。线程:线程是进程的一个执行实体,线程是 CPU 调度和分派的基本单位,线程依附于进程存在,每个线程会共享父进程的资源。协程:**协程是一种用户态的轻量级线程,**协程的调度完全由用户控制,协程间切换只需要保存任务的上下文,没有内核的开销。1.2 并发与并行的区别并发:单核CPU,线程通过时间片或者让出控制权来实现任务切换,达到 “同时” 运行多个任务的目的。本质上任意时刻都只有一个任务被执行,原创 2021-08-19 00:08:32 · 654 阅读 · 0 评论 -
Go 反射reflect空接口与反射结构体属性方法
1、空接口反射1.0、空接口回顾空接口默认可以接收 任何数据类型的数据,那么,如何判断 空接口 接受的值呢?除了 类型断言 switch case遍历排除外,还有内置方法,可以实现获取 空接口数据的类型、值及其修改值。// 空接口作为函数参数func show(a interface{}) { fmt.Printf("type:%T value:%v\n", a, a)}// 类型断言 switch case 获取空接口参数类型func justifyType(x interface原创 2021-08-15 23:34:47 · 546 阅读 · 0 评论 -
Go 序列化json及反序列化结构体
http协议前后端的交互通过json字符串交互,在Go语言中,序列化与反序列化 需要结构体 的转化。1、序列化为 Json 字符串1.1 json.Marshl 序列化func Marshal(v interface{}) ([]byte, error) // 定义 Student类结构体type Student struct { Code int `json:"code"` // 使用tag,表示对应json的字段名 Message string `j原创 2021-08-13 00:12:21 · 1681 阅读 · 1 评论 -
Go 接口(interface)实现、空接口用法分析
接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。0、接口类型在Go语言中,接口(interface)是一种类型,一种抽象的类型。Go语言试图让程序员能在安全和灵活的编程之间取得一个平衡。它在提供严格的类型检查的同时,通过接口类型实现了对鸭子类型的支持,使得安全动态的编程变得相对容易。Go的接口类型是对其它类型行为的抽象和概括;因为接口类型不会和特定的实现细节绑定在一起,通过这种抽象的方式我们可以让对象更加灵活和更具有适应能力。很多面向对象的语原创 2021-08-11 22:50:52 · 1248 阅读 · 0 评论 -
Go 流程控制 if、for、switch、break、goto
Go 支持如下几种流程控制语句:条件语句:关键字有 if、else 和 else if分支语句:关键字有 switch、case 和 select(用于通道,常用协程)循环语句:关键字有 for 和 range跳转语句:用于代码跳转,对应的关键字有 goto注意:golang 没有 while循环~1、if 条件语句1.1 if 语法结构if 是用于测试某个条件(布尔型或逻辑型)的语句,如果该条件成立,则会执行 if 后由大括号括起来的代码块,否则就忽略该代码块继续执行后续的代码。常用原创 2021-06-29 20:59:15 · 1004 阅读 · 2 评论 -
Go fmt格式化 IO
fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf1、对外输出标准库fmt主要提供了Print、Fprint、Sprint、Errorf等几种函数对外输出。1.1 PrintPrint系列函数会将内容输出到系统的标准输出:Print函数直接输出内容Printf函数支持格式化输出字符串Println函数默认会在输出内容的结尾添加一个换行符函数声明:func Print(a ...interface{}) (n int, err error)func Printf原创 2021-06-24 19:51:47 · 389 阅读 · 2 评论 -
Go 结构体匿名嵌套与方法指针接收者
Golang没有对象和继承的概念,也没有很多与面向对象相关的概念,例如继承、多态和重载。But,通过结构体的内嵌再配合接口,可以实现比面向对象更高的扩展性和灵活性。0、初识常见的数据类型数组、切片、字符串、字典、指针等都是指定某一类的数据类型,而结构体则是一种可以包含多种数据类型的数据类型。在Go语言特性下,若是要对标java、python面向对象,那么对应关系如下:结构体(struct),对应面向对象的初始化字段信息,是一个包含多种类型的集合方法(method),对应类的方法,一种作用于特定类型原创 2021-07-16 03:42:49 · 2489 阅读 · 1 评论 -
Go 函数签名、可变参数、装饰器、匿名函数及闭包
1、函数定义无需声明原型支持不定变参支持多返回值支持命名返回参数支持匿名函数和闭包函数也是一种类型,一个函数可以赋值给变量不支持 嵌套 (nested) 一个包不能有两个名字一样的函数不支持 重载 (overload)不支持 默认参数 (default parameter)Go为编译型语言,即函数编写的顺序与执行顺序无关~鉴于可读性,good coder 最好把 main() 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)1.1 函数签名函数参数、原创 2021-07-15 01:19:56 · 1153 阅读 · 3 评论 -
Go 指针数组、指针参数、指针函数及结构体指针
指针是存储另一个变量的内存地址的变量。区别于C/C++中的指针,在Go中的指针不能进行偏移和运算,是安全指针。1、指针地址、指针类型、指针取值在Go中的指针操作非常简单,只需要记住两个符号:&(取地址)和*(根据地址取值)。Golang 支持指针类型 *T,指针的指针 **T,以及包含包名前缀的 *.T。• 默认值 nil,没有 NULL 常量。• 操作符 "&" (取地址符) 取变量地址,"*" (取值符)透过指针访问目标对象。• 不支持指针运算,不支持 "->" 运算符,原创 2021-07-13 00:15:14 · 2353 阅读 · 0 评论 -
Go 字典Map增删改查、排序及其值类型
1、Map 简述哈希表,引用类型,必须初始化才能使用一种无序的基于key-value的数据结构的键值对集合键必须是支持相等运算符 ("=="、"!=") 类型, 如 number、string、 pointer、array、struct,以及对应的 interface值可以是任意类型,没有限制2、Map 声明初始化2.1 Map 声明声明格式:var mapName map[keyType] valueType// 其中:keyType为键类型,valueType为值类型// val原创 2021-07-08 00:07:36 · 878 阅读 · 1 评论 -
Go 数组 array 与 切片 slice 扩容
在go语言中,切片是一个引用类型,类似于python的list,所以它们不需要使用额外的内存并且比使用数组更有效率,切片比数组更常用。那么,先来看看数组。1、数组 array1.1 array 概念数组是固定长度(长度不可修改)的、同一类型的数据集合。数组长度必须是一个常量表达式,且必须是一个非负整数数组元素可以通过 索引(位置)来读取(或者修改),索引从 0 开始。注意:如果让数组元素类型为任意类型的话可以使用空接口作为类型,当使用值时必须先做一个类型判断1.2 array 初始化G原创 2021-06-30 23:47:00 · 1417 阅读 · 2 评论 -
Go 字符串及strings包常见操作
Go 字符串及strings包常见操作1、字符串的定义Go 语言中可以使用反引号或者双引号来定义字符串。反引号表示原生的字符串,即不进行转义。Go 语言的字符串不支持单引号双引号字符串使用双引号括起来,其中的相关的转义字符将被替换。例如:str := "Hello World! \n Hello Gopher! \n"输出:Hello World! Hello Gopher!反引号字符串使用反引号括起来,其中的相关的转义字符不会被替换。例如:str := `Hello W原创 2021-06-18 22:09:21 · 1634 阅读 · 0 评论 -
Go 变量、常量、作用域、数据类型及运算符
Golang 基础:变量、常量、作用域、数据类型及运算符1、变量变量(Variable)的功能是存储数据。不同的变量保存的数据类型可能会不一样。变量代表可变的数据类型,它在程序执行的过程中可能会被一次或多次修改。1.1 变量类型常见变量的数据类型有:整型、浮点型、布尔型等。1.2 变量声明Go语言中的每一个变量都有自己的类型,并且变量必须经过声明才能开始使用。1.3 标准声明变量声明以关键字var开头,变量类型放在变量的后面,行尾无需分号。var 变量名 变量类型示例:var nam原创 2021-06-18 15:43:13 · 292 阅读 · 1 评论 -
go testing包 单元测试
在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类、超类、抽象类等中的方法。单元测试就是软件开发中对最小单位进行正确性检验的测试工作。单元测试文件名必须以xxx_test.go命名方法必须是TestXxx开头,建议风格保持一致(驼峰或者下划线)方法参数必须 t *testing.T测试文件和被测试文件必须在一个包中Go自带的testing包testing 为 Go 语言 package 提供自动化测试的支持。通过 go test 命令,能够自动原创 2021-06-10 21:45:17 · 348 阅读 · 3 评论 -
进阶 go mod 项目 包 规范管理
进阶 go 项目 包管理在 go mod 模式,项目内必须有且仅有一个包含 函数名为 main 的主程序 ,且该 main 函数没有返回值,具体函数部分 后续细讲。0、项目 命名 规范小写字母,中划线 分割单词go-packge-demo1、包 命名 规范packge名 和目录名保持一致包名 尽量为小写字母,包名 勿用 下划线或混合大小写字母,使用多级目录划分层级包名 尽量简洁 易懂2、包内 文件命名 规范文件名 小写,小划线分割单词3、包内 函数命名 规范函数名原创 2021-06-09 21:39:31 · 1211 阅读 · 3 评论 -
go mod 构建新项目 step by step
0、golang 安装官网地址https://golang.google.cn/dl/1、go两种构建模式go语言发展至今因为包依赖的问题有两种的构建模式:经典的gopath mode和目前的go module标准mode。1.1 gopath 【经典传统】1.1.1 gopath说明GOPATH下一般会有三个文件夹src、pkg、bin。src存放项目源码文件(.go结尾)对于src目录,存放源文件,Go中源文件以包(package)的形式组织。通常的,新建一个包就在src目原创 2021-06-05 10:37:23 · 4323 阅读 · 4 评论 -
GO学习路线规划
学习规划数据类型、流程控制、函数式编程、面向对象、错误处理、数据结构算法、并发编程、网络编程、web框架…学习资料原创 2021-06-01 22:12:44 · 344 阅读 · 4 评论