
golang
人生30一道坎
要成为架构师的男人
展开
-
golang中的函数,方法,接口,反射
golang语言代码简洁,编写简单,很大程度上是因为go提供给工程师的语言特性少。go中的功能封装是通过函数进行的,不同结构体之间可以通过接口来进行统一,再结合反射特性就可以开发大型复杂的项目。原创 2022-10-11 17:55:17 · 666 阅读 · 0 评论 -
golang中struct
前面已经介绍的数组,slice,map有一定的相同之处,即处理的都是相同类型的元素,map中的key和value属于相同的类型,但如果要把多个类型的元素放到一起进行处理,则要使用go语言为我们提供的数据结构structstruct非常适合定义一个有意义的对象,可以用于定义属性和方法,这和c语言的结构体,java,class类有些相似。当然struct肯定不是classstruct也是复合类型,而非引用类型,复合类型和引用类型是有区别的,复合类型是值传递,引用类型是引用传递。原创 2022-10-11 15:18:59 · 3261 阅读 · 0 评论 -
golang中map
其中k是键,在同一个map中所有k必须是同一个类型,而且只有可以比较,或者说只有可以使用== 符号比较的类型才可以作为K,显然bool类型作k 并不灵活,而使用浮点型作为k,可能会因为不同机器和系统对于精度定义的不同而导致异常。map的遍历顺序是不固定的,不同的机器可能对HASH算法的使用会有所不同,而且从实际应用来看,mao的遍历顺序确实体现出无序的特征。上例中,delete函数执行时,没有元素也不会报错,虽然map中没有该键,但是不会报错,而是会返回值类型的默认值初始值,int的初始值就是0。原创 2022-10-11 09:55:05 · 344 阅读 · 0 评论 -
golang中slice结构定义
数组可以为空,也就是有0个元素,切片也可以为空,长度可以为0,但容量不为0,也可以两者都为0。因为slice是通过指向的底层数组来存储数据的,而且可能有多个slice指向同一个底层数组,这样就会导致一个情况,如果一个小的切片指向这个底层数组,将会导致底层数组处于使用状态而无法被垃圾回收。append为切片a在尾部追加了一个元素333,cap变成了6,这是slice的自动扩容,如果发现当前的容量不足以容纳新元素,则自动扩展为原来的2倍,当长度太长时,是1.5倍。可知ss切片其实是指向数组a的引用。原创 2022-10-09 14:41:41 · 883 阅读 · 0 评论 -
golang数组
d := [...]int{4,4:1,1:2} 可以看到后面并没有给所有的元素赋值,而且赋值使用了index:value,比如4:1的意思就是下标为4的元素赋值1,这时候数组长度根据出现的最大下标确定,因为定义时没有指定,所以此时数组长度4.[4 2 0 0 1]var b [3] int = [3] int {1,2,3} 定义数组的同时进行初始化的赋值,这种定义方式有些冗余,精简操作就是把比变量b后面的[3]int取消, var b =[3]int {1,2,3}原创 2022-09-27 17:56:29 · 590 阅读 · 0 评论 -
golang中的格式化说明符
UTF-8是unicode标准是一种具体表现,其特点是字符长度可变,长度为1到字节不等,以内具有这个特点,所以塔可以无缝对接ASCII码,如果UTF-8编码的第一个bit位是0,那么长度为一个字节,即只使用第一字节剩下的7位存储字符,这正好能覆盖ASCII字符集。字符串的赋值是需要注意的地方,比如在对s1,s2这两个字符串进行s1=s2的赋值操作时,本质不会进行赋值,仅会传递字符串的地址和字节长度,因为字符串不可变,就没必要再复制一份了。实际上字符串对应的字节序列,存储byte类型的0值也是可以的。原创 2022-09-27 10:42:32 · 1219 阅读 · 0 评论 -
go语言的基本数据类型
算术运算符+ — * / 适用于整型,浮点型和复数,但是取模运算符% 仅用于整型件的运算,取模运算符的符号和被取模数的符号总是一致的,除法运算符/ 的行为则依赖于操作数的类型,;float32输出的结果明显是不对的,这是因为float32是按照默认小数位输出的,但默认的小数点位数并不准确,float64则输出了正确的结果,所以,在使用浮点型是,应尽量使用float64。rune是int32的别名,使用utf-8进行编码,如果要访问字符串中的字符,比如遍历字符串中的每个字符,可以使用这个类型。原创 2022-09-21 17:42:05 · 457 阅读 · 0 评论 -
golang 中的go指针
上面的例子是基本类型,其实符合类型也是变量,他们也有一个地址,也是可以通过指针操作的,复合类型内的具体元素同样有地址,并且可以通过指针进行操作。对于上礼中的p,我们称之为指针类型,指针类型的默认初始值为nil,可以通过p==nil来判断是否取得地址,nil就是未取得。go语言是支持指针的,假设有一个int型变量x,&x表示取x的地址,将此值赋给p,那么p就是指针。go语言中,除非显示的使用指针,否则所有的值传递都是具体值的复制,包括数组等复合数据,对于指针的介绍,go的指针比c++的安全多。原创 2022-09-08 16:24:38 · 1156 阅读 · 1 评论 -
golang 指针变量赋值
以上两种用法中,第一种会根据等号右侧表达式的值推测出其string类型,需要指出的是,第一种用法是go语言中的无类型用法,这种无类型也是一种类型,是一种比基础类型精度更高的类型,至少可以达到256位,比机器硬件精度更高。其中,无类型的 go语言中六种:无类型布尔,无类型整数,无类型文字符号,无类型浮点数,无类型复数,以及无类型字符串。声明常量时可以使用常量生成器iota,iota可以通过枚举创建一系列相关的值,而且不需要明确定义类型,iota每次从0开始取值,逐次加1。通过左移运算符达到乘以2的幂的效果。原创 2022-09-08 14:25:09 · 1806 阅读 · 0 评论 -
golang写第一http接口
使用go语言开发web服务是不需要用户单独阿壮其他服务器的,直接使用标准的net/http包就可以构建web服务了,正如上面的代码所示,这段代码的功能非常简单,通过fmt.Fprintf函数向http请求打印字符串,执行本程序后,可以看到在控制台上输出 server start,然后在浏览器中访问localhost:1234 就可以看到页面显示。函数handler的定义,其参数是固定,因为要满足接口的要求。http.Request代表一次请求,是一个结构体,指针和结构体都会在后文介绍。原创 2022-09-07 17:08:09 · 982 阅读 · 0 评论 -
面试的时候被问到的两个小工具 nload sar
apt install nload nload apt install sysstat sar 1 n原创 2022-08-24 13:18:22 · 211 阅读 · 0 评论 -
golang复习实现流程循环if,比较三个数最大
package mainimport "fmt"func main() { a, b, c := 5, 9, 4 if a > b { if a > c { fmt.Println("a最大") } } else if b > c { fmt.Println("b最大") } else { fmt.Println("c最大") }}if 判断表达式返回结果bool值 {条件分支}else {}不需要break和...原创 2021-12-13 16:33:46 · 505 阅读 · 0 评论 -
golang中的协程同步
chan可以被关闭,尽管它们和文件不同,不必每次都关闭package mainimport ( "fmt" "time")func main() { ch := make(chan string) go sendData(ch) go getData(ch) time.Sleep(1e9)}func sendData(ch chan string) { ch <- "北京" ch <- "上海" ch <- "广州" ch <- "武汉" c原创 2021-11-27 16:44:57 · 407 阅读 · 0 评论 -
golang中channel的传递
需要注意的是,go语言中channel本省也是一个原生类型,与map之类的类型一样,因此channel本省在定义后也可以通过channel来传递可以使用这个特性来实现pipe特性,管道也是使用非常广泛的一种设计模式,比如在处理数据时,可以采用管道设计,这样可以比较容易以插件的方式增加数据的处理流程下面利用channel可被传递的特性来实现管道。type PipeData struct { value int handler func(int) int next cha原创 2021-11-27 14:35:30 · 2204 阅读 · 0 评论 -
golang并发编程协程
执行体是一个抽象的概念,在操作系统层面有多个概念与之对应,比如操作系统自己掌管的进程process ,进程内的线程 thread 以及进程内的协程coroutine也叫轻量级线程。与传统的系统线程和进程相比,协程的最大优势在于其轻量化,可以轻松创建上百万个协程而不会导致系统资源衰竭,而线程和进程通常最多也不能超过1万个。这就是协程也叫轻量级线程的原因 多数语言在语法层面并不直接支持协程,而是通过库的方式支持,但用库的方式支持的功能也并不完整,比如仅仅提供轻量级线程的创建,销毁与切换等能力。如果在这样..原创 2021-11-20 16:38:08 · 611 阅读 · 0 评论 -
golang闭包
package mainimport "fmt"func adder(x int)func(int) int { return func(y int)int { x+=y return x }}func main(){ret := adder(100)ret2 := ret(200)fmt.println(ret2)}定义了一个函数adder,参数数x int 类型,返回值是一个匿名函数func(int)int匿名函数的参数数int,返回值是int匿名函..原创 2021-11-04 16:55:27 · 85 阅读 · 0 评论 -
golang实现回文检测
package mainimport "fmt"func main() { ss := "山西运煤车煤运西山" a := []rune(ss) // fmt.Println(ss) // fmt.Println(a) for i := 0; i < len(a)/2; i++ { fmt.Println(i) if a[i] != a[len(a)-1-i] { fmt.Println("不是回文") return } else { fmt.Pri.原创 2021-11-01 14:40:24 · 292 阅读 · 0 评论 -
golang中字符串与数组,切片的转换
go语言将字符串作为一种原生的基本数据类型,字符串的初始化可以使用字符串的字面量var a = "hello,world"1) 字符串是常量,可以通过类似数组的索引访问其字节单元,但是不能修改某个字节的值var a = "hello,world"b := a[0]a[1]='a'package mainimport "fmt"func main() { var a = "hello , world" b := []byte(a)//此时打印b,以rane方式...原创 2021-10-28 17:53:01 · 5505 阅读 · 1 评论 -
2021-10-25
可以使用哪个函数来创建错误变量errors.New('Employee not found!')go中错误处理和日志记录与其他编程语言中的这些过程不同,go的错误处理方法非常简单,是有if条件,调用的函数应返回多个值。按照管理 最后一个返回值为错误,如果错误变量返回nil,则不存在错误。如果不为nil,则错在错误。只需要多次返回错误即可将错误传播到堆栈。可以创建为可重用为程序中常见错误消息的返回值 的错误变量。你还需要了解何时使用panic,我们已介绍了panic和recover的工作原..原创 2021-10-25 16:35:28 · 79 阅读 · 0 评论 -
golang中切片修改会影响原值
package mainimport "fmt"func main() { var array = [4]string{"beijing", "shanghai", "tianjing", "hangzhou"} fmt.Printf("%#v\n", array) slice := array[:] fmt.Printf("%#v\n", slice) slice1 := slice[2:4] fmt.Printf("%#v\n", slice1) slice1[1] = "南...原创 2021-10-22 15:02:09 · 679 阅读 · 0 评论 -
golang实现斐波那契
package mainimport "fmt"func fibonacci(n int) int { //定义函数,参数是n int类型,输出int类型,返回值是参数的前两个之和 if n < 2 { return n } return fibonacci(n-2) + fibonacci(n-1)}func main() { var i int //定义变量i for i = 0; i < 20; i++ { fmt.Printf("%d\t", fibon.原创 2021-10-22 11:49:18 · 419 阅读 · 1 评论 -
golang中使用控制流
package mainimport "fmt"func main() { cities := [...]string{"beijing", "shanghai", "guangzhou", "shenzhen"} fmt.Println(cities)}即使数组应具有5个元素,也无需为所有的元素分配值,如上所示,最新位置包含一个空的字符串,因为它是字符串数据类型的默认值如果你不知道你将需要多少个位置,但知道你将具有多少数据,可以使用省略号...输出没有空字符串,数组长度由.原创 2021-10-20 16:43:58 · 154 阅读 · 0 评论 -
golang使用defer panic recover 函数进行控制
让我们看看go特有的一些控制流,defer,panic,recover。defer函数go中,defer语句会推迟函数的运行,知道包含defer语句的函数完成,通常情况下,当你想要避免忘记任务是,可以推迟某个函数的运行。可以根据需要推迟任意多个函数,defer语句按逆序运行,先运行最后一个。package mainimport "fmt"func main() { for i := 1; i <= 4; i++ { defer fmt.Println("延迟输出", -i)原创 2021-10-20 13:58:05 · 164 阅读 · 0 评论 -
golang中使用for表达式循环遍历数据
与if switch语句一样,for循环表达式不需要括号,但是需要大括号分号 ; for循环三个组件在第一次迭代之前执行的初始语句在每次迭代之前计算的条件表达式在每次迭代结束时执行的后处理语句func main(){ sum := 0 for i :=1 ;i <= 100;i++ { sum += i}fmt.println("sum of is ",sum)}在某些编程语言中,可以使用while。go没有while关键字package main.原创 2021-10-18 16:55:23 · 1372 阅读 · 0 评论 -
golang中switch流程case分支调用函数
package mainimport ( "fmt" "time")func main() { switch time.Now().Weekday().String() { case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday": fmt.Println("it is time to work") fmt.Println(time.Now().Weekday().String()) default: fmt.P.原创 2021-10-18 14:57:40 · 1368 阅读 · 0 评论 -
golang中使用if/else表达式测试条件
package mainimport "fmt"func main() { x := 27 if x%2 == 0 { fmt.Println(x, "is even") } else { fmt.Println("not") }}package mainimport "fmt"func givemeanumber() int { return -1}func main() { if num := givemeanumber(); num < 0 .原创 2021-10-14 11:02:35 · 311 阅读 · 0 评论 -
golang中包的概念
go中,甚至最直接的程序都会包的一部分。通常情况下默认包是main包,目前为止一直使用的包。如果程序是main包的一部分,go会生成二进制文件,运行该文件时,他将调用main()函数 当使用main包时,程序将生成独立的可执行文件,但当程序非是main包的一部分是,go不会生成二进制文件,它生成包存档文件.a文件go中,包名称需遵循约定,包使用其导入路径的最后一部分作为名称,go标准库包含math/cmplx包,import "math/cmplx"cmplx.Inf()...原创 2021-10-13 17:46:05 · 272 阅读 · 0 评论 -
golang中函数调用
将值传递给函数时,改函数中的每一个更改都不会影响调用方,go是按值传递的编程语言,这意味着每次向函数传递值时,go都会使用该值并创建本地副本,内存中的新变量,在函数中对该变量所做的更改都不会影响你向函数发送的更改。就是开辟了新的内存空间。例如,假设你创建了一个用于更新人员姓名的函数package mainfunc main(){firstName := "john"updateName(firestname)fmt.println(firstName)}func updateName.原创 2021-10-12 17:08:01 · 710 阅读 · 0 评论 -
golang中map的索引验证
package mainimport ( "fmt")func main() { var scoreMap = make(map[string]int, 6) scoreMap["鱼香肉丝"] = 17 scoreMap["溜肉段"] = 15 value, ok := scoreMap["宫保鸡丁"] fmt.Println(value, ok) if ok { fmt.Println("宫保鸡丁还可以点", value) } else { fmt.Println("宫.原创 2021-10-12 16:12:31 · 333 阅读 · 0 评论 -
golang中的包
现今即便是个人开发的一般程序,其包含的函数,这些函数代码一般都有他人编写并打包为包或者模块的形式,并通过相关社区并发,最后有软件通过调用这些包或者模块的函数来更高效的完成开发。通过包或者模块的形式重用代码使得编程开发变得轻松go语言包,fmt os等这样具有常用功能的内置包在go语言中一百多个,我们称为标准库,这些标准包大部分都内置到go语言本身 大部分编程语言都存在包的概念,而任何一种包设计的目的都是为了简化大型软件设计和维修工作 ,实际上包是函数和数据的集合。通过吧一组有关特性的函数和数据...原创 2021-09-22 17:58:29 · 272 阅读 · 0 评论 -
golang中映射
映射是一种数据结构,用于存储一系列无序的键值对,映射基于键来储存值,映射功能强大的地方是,能基于键快速检索数据,键就像索引一样,指向与该键关联的值。与C++,JAVA不一样,go使用映射map不需要引入任何库。因为映射也是一个数据集合,所以也可以使用类似处理数组和切片的方式来迭代映射中的元素。但映射是无序集合。所以即使以同样的书序保存键值对,每次迭代映射时,元素顺序也可能不一样,无序的原因是映射的实现使用了散列表。go语言中的map在底层是用哈希表实现的,在goroot/src/pkg/runt原创 2021-09-22 14:20:44 · 275 阅读 · 0 评论 -
golang中的复合数据类型
了解数据结构一般会从数组开始,因为数组是切片和映射的基础数据结构,理解了额数组的工作原理,有助于理解切片和映射提供的优雅,强大的功能。数组是具有相同类型的一组已经编号且长度固定的数据项序列,这个序列可以是有序的也可以是无序的,组成数组的各个变量常为数组的元素。这种类型可以是任意的原始类型int,string,自定义类型。数组长度必须是一个非负整数的常量,或常量表达式,数组长度也是数组类型的一部分,数组的声明需要指定元素的数据类型,以及存储元素的数量, var array [5] int数组一单.原创 2021-09-08 17:55:32 · 301 阅读 · 0 评论 -
golang中的递归函数
递归就是在运行的过程中调用自己func recursion(){recursion()}函数调用自身func main(){recursin()}go语言支持递归,但在使用递归时,开发者需要设置退出条件,否则递归将陷入无线循环,递归函数对于解决数学上的问题是非常有用的,就像阶乘,斐波那契等package mainimport "fmt"func Factorial(n uint64) (result uint64) { if n > 0 { result原创 2021-09-02 17:41:36 · 956 阅读 · 0 评论 -
golang中匿名函数与闭包
匿名函数是指不需要定义函数名的一种函数定义方式,匿名函数在很多语言中都有。func (x,y int)int {return x+y}这个函数声明中并没有命名函数名称,所以这样的一个函数不能独立存在,但可以被赋值与某个变量,即保存函数的地址到变量中fplus :=func (x,y int)int{return x+y}fplus(3,4)通过变量名对函数进行调用,这个例子返回数字7。除此之外还可以直接调用匿名函数func(x,y int)int {return x+y}(3,4)原创 2021-09-02 16:55:46 · 198 阅读 · 0 评论 -
golang中的函数问题
函数作为参数,函数是第一类对象,可作为参数传递,只要被调用函数的返回值个数,返回值类型和返回值的顺序与调用函数所需要的实参是一致的,就可以吧这个被调用 的函数当做其他函数的参数。func f1(a,b,c int)func f2(a,b int)(int,int,int)func f1(f2(a,b))函数f1需要三个参数,同时f2返回三个参数package mainimport "fmt"func pipe(ff func() int) int { return ff()}原创 2021-09-02 16:05:16 · 106 阅读 · 0 评论 -
golang中的函数
go语言顺序编程(过程式编程)中的基本语法概念,本次再此基础上介绍函数的概念,函数是包含用执行某一任务或者计算的系列语句,通过一系列语句的包装,使其更便于阅读,是使其更加简单明,清晰便捷。main函数是程序的入口,而且因为go语言是编译型语言,所以函数编写的顺序是无关紧要的,但是为了可读性,最好吧main函数写在文件的前面,其他函数按照一定的逻辑顺序进行编写,对于熟悉java或者其他编程语言的读者来说,对于函数和方法可能有些误解,go语言中,函数和方法不一样,有明确的区别,但对java而言,一般可以原创 2021-09-02 13:31:33 · 110 阅读 · 0 评论 -
golang中goto语句
go语言中goto语句可以无条件跳转到相同函数的带标签语句,标签,goto等关键字都并非go语言独创,go语言可以说是一门大量参考了其他语言有点的编程语言,在流程控制上做了一些扩增,同事也减少了一些关键字package mainfunc main() { var i intBREAK: for { println(i) i++ if i > 2 { // goto BREAK break BREAK } } println("break")}原创 2021-09-01 13:22:13 · 1176 阅读 · 0 评论 -
golang中的标签
go语言中有一个特殊的概念就是标签,可以给for switch select等流程控制代码块上一个标签。配合标签标识符可以方便跳转到某一个地方继续执行,有助于提高标称效率标签的名称是区分大小写的,为了提高代码易读性,建议标签名称使用大写字母和数字,标签可以标记任何语句,并不限定与流程控制语句,未使用的标签会引发错误break语句意思是打断,这个语句表示打断当前流程控制package mainimport "fmt"func main() { for i := 0; i < 1.原创 2021-09-01 11:42:53 · 907 阅读 · 0 评论 -
golang中的延迟语句
go语言还有一些特殊的控制语句,defer就是其中的一种,defer用于延迟调用指定函数,defer关键字只能出现在函数内部package mainimport "fmt"func main() { defer fmt.Println("world") fmt.Printf("hello")}上面的例子会首先打印hello,然后打印world,因为第一句使用了defer关键字,defer语句的会在函数最后执行,被延迟的操作是defer后面的内容。defer后面的表达式必须.原创 2021-09-01 10:59:45 · 267 阅读 · 0 评论 -
golang中循环语句
循环语句是编程中常使用的流程控制语句之一,go语言中,循环语句的关键字是for,没有while关键字,for语句可以根据指定的条件重复执行其内部的代码块,这个判断条件一般是有for关键字后面的子语句给出的package mainimport "fmt"func main() { for a := 0; a < 5; a++ { fmt.Printf("a的值是%d\n", a) }}上面的for关键字后面有三个自语句,初始化变量a为0,并判断当a小于5时执行下面代码块的内原创 2021-08-31 17:10:26 · 1369 阅读 · 0 评论