
Golang入门&语法
重新捡起go语言的学习,完整学习路径请从https://github.com/LeoLeeWithWarmPants/golangStudy自取
保暖大裤衩LeoLee
芜湖~~~
展开
-
Golang:线程模型,CSP,MPG
并发和并行并发和并行都是为了充分利用 CPU 多核计算资源所提出来的概念,相信我们或多或少都对二者的概念有所了解: 并发指的是在同一时间段内,多条指令在 CPU 上同时执行; 并行指的是在同一时刻内,多条指令在 CPU 上同时执行。 并发程序并不要求 CPU 具备多核计算的能力。在同一时间段内,多个线程会被分配一定的执行时间片,在 CPU 上被快速轮换执行。线程执行的时间片时间耗尽或者任务完成了,会被 CPU 调度换下,执行其他的线程任务。通过这样的方式,可以在宏观上模拟出多转载 2022-01-24 15:48:09 · 836 阅读 · 0 评论 -
Golang:struct定义与试用以及内存分析
概述Golang虽然具有OOP的特性,但是并没有类的概念,也没有继承关键字。提供了一个类似于类功能,但是又截然不同的概念:结构体struct。定义有四种定义方式:package mainimport "fmt"//struct定义type Person struct { Id int64 Name string Age int8}type Student struct { baseInfo Person ptr *int //指针 array原创 2021-10-16 15:26:48 · 913 阅读 · 0 评论 -
Golang:map的定义、操作、排序以及map切片
map概述golang中的引用类型。与其他语言中的map类型基本相似,都是k-v形式的,k不可重复,元素是无序的,并且支持扩容。基本语法var 变量名 map[keytype]valuetypekey可以是很多类型bool、数字、string、指针、channel,还可以是只包含前面几种类型的 接口、结构体、数组。但是!!!slice、map、function是不可以作为map的key,因为无法使用 == 判断key是否相等。value的类型就没有特别的要求声明m原创 2021-09-23 12:09:44 · 1500 阅读 · 0 评论 -
Golang:数组定义、初始化
概述golang中的数组与其他一些语言中的数组,不同点在于:golang中的数组是值类型,并非是基础数据类型,这一点很重要。 可以使用指针来对数组进行引用传递。 数组初始化之后,长度确定,每个元素的值为数组类型的默认值。 数组的地址与数组的第一个元素的地址一致。 除数组第一个元素外的其他元素的地址=前一个元素的地址+数组类型所占用的字节数,即数组中的元素地址是连续的。所以当我们使用print打印数组的时候,数组的第一个元素地址即可代表该数组的地址,根据第一个元素的地址,可以得出之后每一个原创 2021-09-15 16:33:34 · 5337 阅读 · 0 评论 -
Golang:切片的声明、初始化以及操作示例,详解、概括
Golang基础学习项目地址:https://github.com/LeoLeeWithWarmPants/golangStudyhttps://github.com/LeoLeeWithWarmPants/golangStudy概述slice本质上是一个数据结构(struct结构体)。 切片是数组的一个引用,即切片的底层是一个数组,所以切片是一个引用类型。 切片的长度是可以变化,由于其支持扩容(类似于Java的List),可以理解切片为一个“长度动态变化的数组”。 需要注原创 2021-09-15 13:03:35 · 1537 阅读 · 0 评论 -
Golang:错误的捕获、抛出错误、自定义错误
概述Golang中,程序的执行异常被称作为error,Java中称为exception。相应的,Golang中也会出现运行时error,也会需要捕捉错误、处理错误,乃至自定义错误满足开发的需求。运行时错误运行时错误,就是代码运行时无法预见的错误,类似于Java的RuntimeException及其子异常。简单的除以0的demo://产生运行时异常n1 := 1n2 := 0fmt.Printf("result=%d\n", n1/n2)捕捉错误使用defer+recove原创 2021-09-07 01:30:25 · 2210 阅读 · 0 评论 -
Golang:一个示例讲明白defer怎么用
package mainimport "fmt"func sum(n1 int, n2 int) int { defer fmt.Printf("defer: n1=%d\n", n1) defer fmt.Printf("defer: n2=%d\n", n2) n1 += 2 n2 += 2 res := n1 + n2 fmt.Printf("func sum res=%d\n", res) return res}func main() { res := sum(1, .原创 2021-09-04 00:48:25 · 166 阅读 · 0 评论 -
Golang:init函数与匿名函数介绍
Init函数init函数总是在main函数之前执行,通常在init函数中执行一些初始化操作。package mainimport "fmt"func init() { fmt.Println("func init executing...")}func main() { fmt.Println("func main executing...")}如果一个文件同时包含了全局变量、init函数、main函数,那么执行的顺序是:全局变量的定义 init函数 main函原创 2021-09-01 01:46:35 · 305 阅读 · 0 评论 -
Golang:函数定义、使用超详细总结
代码地址:https://github.com/LeoLeeWithWarmPants/golangStudy/tree/main/project9func测试类:package mainimport ( "fmt" u "golangStudyProject/project9func/utils" //如果包名过长,可以设置包的别名,如别名u代替utils)//需要注意的是,在golang中,基本数据类型和数组都是值传递,即函数内改变形参不影响函数外的基本数据类型和数组的值//g原创 2021-08-29 18:01:42 · 661 阅读 · 0 评论 -
Golang:代码执行流程控制
顺序控制与其他语言一样,都是从上到下执行的代码。分支控制if-else基本语法:var age int8age = 18//if的语法可以省略if age > 18 { fmt.Println("成年人")} else if age == 18 { fmt.Println("刚刚成年")} else { fmt.Println("未成年")}在条件判断语句中声明变量:if age2 := 20; age2 > 18 { fmt.Println(原创 2021-08-28 19:48:13 · 221 阅读 · 0 评论 -
Golang:基础知识
值类型和引用类型 值类型:基本数据类型(int、uint、float、bool、string)、数组以及结构体struct 变量直接存储值,内存通常在栈中分配(也有例外的情况,姑且先这么理解) 引用类型:指针pointer、切片slice、map、管道chan、interface等都是引用类型 变量存储的是一个地址,这个地址对应的内存空间才真正存储数据,内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间便成为了一个垃圾,需要由GC回收。 如下代码和图片为基本数据原创 2021-08-28 17:29:18 · 195 阅读 · 0 评论 -
Golang:指针以及内存布局
任何值类型,都有对应的指针类型,形式为 *[数据类型],比如int对应的指针类型为 *int,float64对应的指针类型为 *float64。值类型包括:基本数据类型、string、数组、结构体struct。都有对应的指针类型。直接看示例代码://基本数据类型的内存布局var i8 int8 = 10//i的内存地址fmt.Printf("i8的内存地址:%v,&i8的类型:%T\n", &i8, &i8)var ptr *int8 = &i8fmt原创 2021-08-22 20:26:39 · 359 阅读 · 0 评论 -
Golang:基本数据类型的转换
Golang与Java、C等其他语言不同,在不同的数据类型的变量之间赋值的时候,需要显式的转换,也就是说Golang中数据类型不能自动转换。不管是低精度到高精度,还是高精度到低精度,都需要显式的转换。基本语法表达式:T(v),T为数据类型,v是需要转换的为V类型的变量。示例var i8 int8 = 100var f32 float32 = float32(i8)fmt.Printf("f32=%f\n", f32)var i32 int32 = int32(i8)fmt.Prin原创 2021-08-22 00:56:56 · 394 阅读 · 0 评论 -
Golang:基本数据类型
如何查看数据类型以及数据占用字节大小查看数据类型a := 2 // 或者 var a = 2fmt.Printf("a data type:%T", a)查看数据占用字节数b := 2 // 或者 var b = 2fmt.Printf("a need %d bytes\n", unsafe.Sizeof(b))在实际编程中,如果能确定变量的取值范围,尽量的明确指定具体的类型,减小字节占用。整数类型有符号整数类型 有无符号 占用储存空间 取值范围.原创 2021-08-21 17:08:54 · 179 阅读 · 0 评论 -
Golang:变量的声明
Go的变量声明还是很灵活的,相比于Java来说有两个特点:玩法更多 能省则省package mainimport "fmt"//全局变量var n1 int = 1var n2 = 2//全局变量不可以使用n3 := 3方式省略var关键字//批量声明var ( n3 = 100 n4 = 200 str1 = "Leo Lee")//变量的使用func main() { //1.指定变量类型,声明变量后不赋值,变量将会使用默认值 var i int原创 2021-08-20 01:47:15 · 382 阅读 · 0 评论 -
我又开始学习Golang了
前言关于Golang,对我来说真的是一个很尴尬的事情,其实早些年就已经听说了Golang这个被大家称为“天然支持高并发”的新语言了,Golang的专栏我19就创建好了,再买了本书,买了一节网课,写了四五篇博客之后就不了了之了,就进入了两年职业生涯起伏不定的阶段。这个阶段发生了太多的事情,不管是生活还是工作哪个方面来看,回过头来看真的是一言难尽。之后就围绕老本行Java一直在学习,直到上个月初从上一家公司提出离职,上个月中无缝跳槽到现在的公司之后,我又规划了之后的学习内容(大数据、Golang),而Gol原创 2021-08-19 01:52:35 · 222 阅读 · 0 评论 -
Go语言容器map——并发编程中sync.Map的使用
Go语言中的map在常规操作方面和Java中的map类型基本类似,作为一个键值对容器,无疑是大大方便了编程过程中业务数据储存,在json转换时,也常常需要使用map作为中间容器过度,今天就来说一说这一重要容器的并发编程要注意的问题。Go语言中的 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的。// 创建一个int到int的映射m := make(map[int]i...原创 2020-01-06 14:36:00 · 372 阅读 · 0 评论 -
Go语言容器 —— 切片(slice)
切片的定义切片(slice)是对数组的一个连续片段的引用(切片默认指向一段连续内存区域,可以是数组,也可以是切片本身),所以切片是一个引用类型,又或者是理解为一个Go数组的一个抽象,可以作为一个动态数组来看待。切片的内部结构包含地址、大小和容量,一般用于快速地操作一块数据集合创建一个100万个int类型元素的数组,并将它传递给函数,将会发生什么?var array [le6]in...原创 2019-12-30 15:29:34 · 480 阅读 · 0 评论 -
Go语言type关键字(类型别名)
前言在讨论type关键字之前,先了解一下type关键字的意义。类型别名是 Go 1.9 版本添加的新功能,主要用于解决代码升级、迁移中存在的类型兼容性问题。Go语言难免和C/C++进行比较,在 C/C++语言中,代码重构升级可以使用宏快速定义一段新的代码,Go语言中没有选择加入宏,而是解决了重构中最麻烦的类型名变更问题。由于工作之后没有进行过任何C语言编程开发,这里不做详细讨论,主要是为了说...原创 2019-12-26 18:58:28 · 1069 阅读 · 0 评论 -
golang fmt格式“占位符”
golang 的fmt 包实现了格式化I/O函数,类似于C的 printf 和 scanf。# 定义示例类型和变量type Human struct { Name string}var people = Human{Name:"zhangsan"}普通占位符占位符 说明 举例 ...原创 2019-12-25 17:03:46 · 149 阅读 · 0 评论 -
go语言iota 常量生成器的常见用法与坑
iota常量生成器作为一个用于生成一组以相似规则初始化的常量的工具,本身并没有太多可以说的地方,在看到的相关go语言语法教程中也并没有太多体现,搜索了相关资料后发现,其常量生成还是有一些要注意的细节。1.iota只能在常量的表达式中使用fmt.Println(iota) 编译错误: undefined: iota2.每次 const 出现时,都会让 iota 初始化为0,被显示...原创 2019-12-20 14:55:43 · 374 阅读 · 0 评论 -
go语言变量逃逸理解
变量内存的分配和变量的生命周期以及堆、栈有着密不可分的关系什么是栈(stack)是一种拥有特殊规则的线性表数据结构栈只允许从线性表的同一端放入和取出数据,按照后进先出(LIFO,Last InFirst Out)的顺序,如下图所示。 往栈中放入元素的过程叫做入栈。入栈会增加栈的元素数量,最后放入...原创 2019-12-20 11:59:43 · 361 阅读 · 0 评论