go语言

10.Go语言基础之包

爱⌒轻易说出口 提交于 2020-02-04 23:22:34
在工程化的GO语言开发项目中,GO语言的源码复用是建立在包(pakage)基础之上的。 不仅GO语言中有包的概念,别的语言中也是有包的概念的。 1.Go语言的包(package) 1.1包介绍 包(package)是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt,os,io等。 1.2定义包 我们可以根据自己的需要创建自己的包。 一个包可以简单理解为一个存放.go文件的文件夹。该文件夹下面的所有go文件都要在代码的第一行添加如下代码,声明改文件归属的包。 package 包名 注意事项: 1.一个文件夹下面直接包含的文件只能归属一个package,同样一个package的文件不能再多个文件夹下。 2.包名可以不和文件夹的名字一样,包名不能包含-符号。 3.包名为main的包为应用程序的入口包,这种包编译后会得到一个可执行文件,而编译不包含main包的源代码则不会得到可执行文件。 1.3可见性 如果想在一个包中引用另外一个包里的标识符(如变量,常量,类型,函数等)时,该标识符必须是对外可见的(public)。 在Go语言中,只需要将标识符的首字母大写就可以让标识符对外可见了。 package pkg2 import "fmt" // 包变量可见性 var a = 100 // 首字母小写,外部包不可见,只能在当前包内使用 //

9.Go语言基础之结构体

有些话、适合烂在心里 提交于 2020-02-04 20:55:20
Go语言中没有类的概念,也不支持“类”的继承等面向对象的概念。 Go语言中通过结构体的内嵌再配合接口,比面向对象具有更高的扩展性和灵活性。 1.类型别名和自定义类型 1.1自定义类型 在Go语言中有一些基本的数据类型,如string,整型,浮点型,布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型。 自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。 //将MyInt定义为int类型 type MyInt int 通过Type关键字的定义,MyInt就是一种新的类型,它具有int的特性。 1.2类型别名 类型别名是Go1.9版本添加的新功能。 类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。就像我们的英文名,乳名,但这些名字都指的是一个人。 type TypeAlias = type 我们之前见过的rune和byte都是类型别名,他们的定义如下: type byte = uint8 type rune = int32 1.3类型定义和类型别名的区别 类型别名与类型定义,表面上看只有一个等号的差异,我们可以通过下面的代码来查看他们的区别。 package main import "fmt" type NewInt int type MyInt = int func main(

go语言基础二 函数 ,递归函数 ,指针

五迷三道 提交于 2020-02-04 20:34:27
函数的定义: func 函数名(参数列列表)(返回参数列列表){ //函数体 } func funcName (parametername type1, parametername type2...)(output1 type1, output2 type2...) { / / 逻辑代码 // 返回多个值 return value1, value2... } 函数定义解析:    func:函数关键字。 函数由 func 开始声明   funcName:函数名。 函数名和参数列列表⼀一起构成了了函数签名。 函数名由字⺟母、数字和下划线组成。函数名的第⼀一个字⺟母不不能为 数字。在同⼀一个包内,函数名称不不能重名。        parametername type:参数列列表。 参数就像⼀一个占位符,定义函数时的参数叫做形式参数,形参变 量量是函数的局部变量量;当函数被调⽤用时,你可以将值传递给参数, 这个值被称为实际参数。 参数列列表指定的是参数类型、顺序、及参数个数。 参数是可选的,也就是说函数也可以不不包含参数。 参数类型的简写 在参数列列表中,如果有多个参数变量量,则以逗号分隔;如果 相邻变量量是同类型,则可以将类型省略略。 例例如:func add (a , b int) {} Go语⾔言的函数⽀支持可变参数。接受变参的函数是有着不不定数量量的 参数的。 func

实例学习Golang--package

廉价感情. 提交于 2020-02-04 04:57:52
包 是多个Go源码的集合,是一种高级的代码复用方案,Go语言为我们提供了很多内置包,如fmt、os、io 等。 如果想在一个包中引用另外一个包里的标识符(如变量、常量、类型、函数等)时,该标识符必须是对外可见的(public)。在Go语言中只需要将标识符的首字母大写就可以让标识符对外可见了。 包的导入 import导入语句通常放在文件开头包声明语句的下面。 导入的包名需要使用双引号包裹起来。 包名是从$GOPATH/src/后开始计算的,使用/进行路径分隔。 Go语言中禁止循环导入包。 例子:把加减乘除计算的方法放在包里被引用 文件结构: usepackage -- main.go mathtool // 名字可以随便取,可以不跟package 名一样。但是底下所有go文件都得归属与同一个package -- add.go -- sub.go -- other.go 代码: usepackage\main.go package main import ( "fmt" s "github.com/sun******/learning/mathtool" ) // 修改包名的时候想到的,尽可能的引用包别名,这样,包名改变不影响其他代码 func main() { a := 2 b := 1 fmt.Println(s.Add(a, b)) fmt.Println(s.Sub(a, b)

Go语言中的结构体

有些话、适合烂在心里 提交于 2020-02-04 00:48:39
Go语言结构体 struct里面可以包含多个字段(属性) struct类型可以定义方法,注意和函数的区分 struct类型是值类型 struct类型可以嵌套 struct中的所有字段在内存是连续的 结构体是用户单独定义的类型,不能和其他类型进行强制转换 struct 没有构造函数 ,一般可以使用工厂模式来解决这个问题 工厂模式也就是定义一个全局函数,传入一些参数,返回一个结构体 结构体中字段可以没有名字,即 匿名字段 此时如果匿名字段是一个结构,即讲解实现了 继承 struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化 package main import ( "encoding/json" "fmt" ) type Student struct { Name string `json:"student_name"` Age int `json:"age"` Score int `json:"score"` } func main ( ) { var stu Student = Student { Name : "stu01" , Age : 18 , Score : 80 , } // 把这个结构体打包 data , err := json . Marshal ( stu ) if err != nil { fmt

8.Go语言基础之指针

元气小坏坏 提交于 2020-02-04 00:27:09
Go语言中的指针不能进行偏移和运算,是安全指针。 在了解GO语言中的指针前,首先需要知道三个概念:指针地址、指针类型和指针取值。 1.Go语言中的指针 任何数据载入内存后,在内存中都有对应的地址,这就是指针。 为了保存一个数据在内存中的地址,需要指针变量。 比如"好好学习,天天向上"这个字符串写入程序中,程序一启动这句话就加载到内存(假设内存地址为0x123456),在程序中,把该字符串赋值给变量A,把该字符串的内存地址赋值给变量B。 这时变量B就是一个指针变量。通过变量A和变量B都能找到该字符串。 Go语言中的指针不能进行偏移和运算,因此Go语言中的指针操作非常简单,只需要记住两个符号:&(取地址)和*(根据地址取值)。 也需要记得: 值类型有:int、float、bool、string、array、struct 引用类型有:指针,map,切片,chan 1.1指针地址和指针类型 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。 Go语言中使用&字符放在变量前面对变量进行“取地址”操作。 Go语言中的值类型(int,float,bool,string,array,struct)都有对应的指针类型,如*int,*in64,*string等。 取变量指针的语法如下: ptr := &v // v的类型为T 其中: v:代表被取地址的变量,类型为T ptr

Go语言 list列表

喜夏-厌秋 提交于 2020-02-03 23:54:53
在Go语言中,列表使用 container/list 包来实现,内部的实现原理是双链表,列表能够高效地进行任意位置的元素插入和删除操作。 初始化列表 list 的初始化有两种方法:分别是使用 New() 函数和 var 关键字声明,两种方法的初始化效果都是一致的。 1) 通过 container/list 包的 New() 函数初始化 list 变量名 := list.New() 2) 通过 var 关键字声明初始化 list var 变量名 list.List 列表与切片和 map 不同的是,列表并没有具体元素类型的限制,因此,列表的元素可以是任意类型,这既带来了便利,也引来一些问题,例如给列表中放入了一个 interface{} 类型的值,取出值后,如果要将 interface{} 转换为其他类型将会发生宕机。 在列表中插入元素 双链表支持从队列前方或后方插入元素,分别对应的方法是 PushFront 和 PushBack。 提示 这两个方法都会返回一个 *list.Element 结构,如果在以后的使用中需要删除插入的元素,则只能通过 *list.Element 配合 Remove() 方法进行删除,这种方法可以让删除更加效率化,同时也是双链表特性之一。 从列表中删除元素 列表插入函数的返回值会提供一个 *list.Element 结构

[ golang ] golang 语言特性

感情迁移 提交于 2020-02-03 14:00:07
一、golang 语言特性 golang 语言特性主要包括以下几点: q 自动垃圾回收 q 更丰富的内置类型 q 函数多返回值 q 错误处理 q 匿名函数和闭包 q 类型和接口 q 并发编程 q 反射 q 语言交互性 自动垃圾回收 C 语言代码不支持垃圾自动回收,会导致指针存在如下两个问题: void foo() { char * p = new char [128]; ... // 对 p 指向的内存块进行赋值 func1(p); // 使用内存指针 delete [] p; } 1 、各种非预期的原因, 比如由于开发者的疏忽导致最后的 delete 语句没有被调用,都会引发经典而恼人的内存泄露问题。假如该函数被调用得非常频繁,那么我们观察该进程执行时,会发现该进程所占用的内存会一直疯长 ,直至占用所有系统内存并导致程序崩溃,而如果泄露的是系统资源的话,那么后果还会更加严重,最终很有可能导致系统崩溃。 2 、手动管理内存的另外一个问题就是由于指针的到处传递而无法确定何时可以释放该指针所指向的内存块 。假如代码中某个位置释放了内存,而另一些地方还在使用指向这块内存的指针,那么这些指针就变成了所谓的 “ 野指针 ” ( wild pointer )或者 “ 悬空指针 ” ( dangling pointer ),对这些指针进行的任何读写操作都会导致不可预料的后果。 由于其杰出的效率,

Go_channel

99封情书 提交于 2020-02-03 06:51:01
通道可以被认为是Goroutines通信的管道。类似于管道中的水从一端到另一端的流动,数据可以从一端发送到另一端,通过通道接收。 在前面讲Go语言的并发时候,我们就说过,当多个Goroutine想实现共享数据的时候,虽然也提供了传统的同步机制,但是Go语言强烈建议的是使用Channel通道来实现Goroutines之间的通信。 “不要通过共享内存来通信,而应该通过通信来共享内存” 这是一句风靡golang社区的经典语 Go语言中,要传递某个数据给另一个goroutine(协程),可以把这个数据封装成一个对象,然后把这个对象的指针传入某个channel中,另外一个goroutine从这个channel中读出这个指针,并处理其指向的内存对象。Go从语言层面保证同一个时间只有一个goroutine能够访问channel里面的数据,为开发者提供了一种优雅简单的工具,所以Go的做法就是使用channel来通信,通过通信来传递内存数据,使得内存数据在不同的goroutine中传递,而不是使用共享内存来通信。 一、 什么是通道 1.1 通道的概念 通道是什么,通道就是goroutine之间的通道。它可以让goroutine之间相互通信。 每个通道都有与其相关的类型。该类型是通道允许传输的数据类型。(通道的零值为nil。nil通道没有任何用处,因此通道必须使用类似于map和切片的方法来定义。) 1

Go语言 map使用例子(Go语言映射)

别来无恙 提交于 2020-02-03 00:29:11
  Go语言中 map 是一种特殊的 数据结构 ,一种元素对(pair)的无序集合,pair 对应一个 key(索引)和一个 value(值),所以这个结构也称为关联数组或字典,这是一种能够快速寻找值的理想结构,给定 key,就可以迅速找到对应的 value。 map 这种数据结构在其他编程语言中也称为字典( Python )、hash 和 HashTable 等。 map 概念 map 是引用类型,可以使用如下方式声明: var mapname map[keytype]valuetype 其中: mapname 为 map 的变量名。 keytype 为键类型。 valuetype 是键对应的值类型。 示例 package main import "fmt" func main() { var mapLst map[string]int mapLst = map[string]int{"one": 1, "two": 2} //mapAssign 是 mapLst 的引用,对 mapAssign 的修改也会影响到 mapLst 的值 mapAssign := mapLst //可以使用 make(),但不能使用 new() 来构造 map,如果错误的使用 new() 分配了一个引用对象,会获得一个空引用的指针,相当于声明了一个未初始化的变量并且取了它的地址 mapCreated