自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(439)
  • 资源 (1)
  • 收藏
  • 关注

转载 Printf 和反射

在 Go 语言的标准库中,前几节所述的反射的功能被大量地使用。举个例子,fmt 包中的 Printf(以及其他格式化输出函数)都会使用反射来分析它的 … 参数。 Printf 的函数声明为:func Printf(format string, args ... interface{}) (n int, err error) Printf 中的 … 参数为空接口类型。Pr...

2018-04-07 14:45:22 105

转载 反射包

方法和类型的反射 我们看到可以通过反射来分析一个结构体。本节我们进一步探讨强大的反射功能。反射是用程序检查其所拥有的结构,尤其是类型的一种能力;这是元编程的一种形式。反射可以在运行时检查类型和变量,例如它的大小、方法和 动态 的调用这些方法。这对于没有源代码的包尤其有用。这是一个强大的工具,除非真得有必要,否则应当避免使用或小心使用。 变量的最基本信息就是类型和值:反射包的 Typ...

2018-04-07 14:26:42 173

转载 空接口

概念 空接口或者最小接口 不包含任何方法,它对实现不做任何要求:type Any interface {} 任何其他类型都实现了空接口(它不仅仅像 Java/C# 中 Object 引用类型),any 或 Any 是空接口一个很好的别名或缩写。 空接口类似 Java/C# 中所有类的基类: Object 类,二者的目标也很相近。 可以给一个空接口类型的变量 var...

2018-04-07 14:05:05 709

转载 第二个例子:读和写

读和写是软件中很普遍的行为,提起它们会立即想到读写文件、缓存(比如字节或字符串切片)、标准输入输出、标准错误以及网络连接、管道等等,或者读写我们的自定义类型。为了让代码尽可能通用,Go 采取了一致的方式来读写数据。io 包提供了用于读和写的接口 io.Reader 和 io.Writer:type Reader interface { Read(p []byte) (n i...

2018-04-07 00:26:59 129

转载 第一个例子:使用 Sorter 接口排序

简介 一个很好的例子是来自标准库的 sort 包,要对一组数字或字符串排序,只需要实现三个方法:反映元素个数的 Len()方法、比较第 i 和 j 个元素的 Less(i, j) 方法以及交换第 i 和 j 个元素的 Swap(i, j) 方法。 排序函数的算法只会使用到这三个方法(可以使用任何排序算法来实现,此处我们使用冒泡排序):func Sort(data Sorte...

2018-04-07 00:24:15 912

转载 使用方法集与接口

作用于变量上的方法实际上是不区分变量到底是指针还是值的。当碰到接口类型值时,这会变得有点复杂,原因是接口变量中存储的具体值是不可寻址的,幸运的是,如果使用不当编译器会给出错误。考虑下面的程序:package mainimport ( "fmt")type List []intfunc (l List) Len() int { return len(l)}...

2018-04-07 00:13:07 217

转载 测试一个值是否实现了某个接口

假定 v 是一个值,然后我们想测试它是否实现了 Stringer 接口,可以这样做:type Stringer interface { String() string}if sv, ok := v.(Stringer); ok { fmt.Printf("v implements String(): %s\n", sv.String()) // note: sv,...

2018-04-07 00:03:56 831

转载 类型判断:type-switch

接口变量的类型也可以使用一种特殊形式的 switch 来检测:type-switchswitch t := areaIntf.(type) {case *Square: fmt.Printf("Type Square %T with value %v\n", t, t)case *Circle: fmt.Printf("Type Circle %T with val...

2018-04-06 23:57:40 1074

转载 类型断言:如何检测和转换接口变量的类型

简介 一个接口类型的变量 varI 中可以包含任何类型的值,必须有一种方式来检测它的 动态 类型,即运行时在变量中存储的值的实际类型。在执行过程中动态类型可能会有所不同,但是它总是可以分配给接口变量本身的类型。通常我们可以使用 类型断言 来测试在某个时刻 varI 是否包含类型 T 的值:v := varI.(T) // unchecked type assertion...

2018-04-06 23:39:46 421

转载 接口嵌套接口

一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样。比如接口 File 包含了 ReadWrite 和 Lock 的所有方法,它还额外有一个 Close() 方法。type ReadWrite interface { Read(b Buffer) bool Write(b Buffer) bool}type Lock in...

2018-04-06 23:22:09 1057

转载 接口是什么

简介 Go 语言不是一种 “传统” 的面向对象编程语言:它里面没有类和继承的概念。 但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来 说明 对象的行为:如果谁能搞定这件事,它就可以用在这儿。 接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。通过如下格式定义...

2018-04-06 23:15:53 190

转载 Java 数据访问对象模式

Java设计模式 - 数据访问对象模式数据访问对象模式或DAO模式将数据访问API与高级业务服务分离。DAO模式通常具有以下接口和类。数据访问对象接口定义模型对象的标准操作。数据访问对象类实现以上接口。可能有多个实现,例如,一个用于数据库,一个用于文件。模型对象简单的POJO包含get/set方法来存储数据。import java.util.ArrayList;imp...

2018-04-06 21:54:00 262

转载 垃圾回收和 SetFinalizer

Go 开发者不需要写代码来释放程序中不再使用的变量和结构占用的内存,在 Go 运行时中有一个独立的进程,即垃圾收集器(GC),会处理这些事情,它搜索不再使用的变量然后释放它们的内存。可以通过 runtime 包访问 GC 进程。通过调用 runtime.GC() 函数可以显式的触发 GC,但这只在某些罕见的场景下才有用,比如当内存资源不足时调用 runtime.GC(),它会在此函数执行的点...

2018-04-06 18:12:11 559

转载 类型的 String() 方法和格式化描述符

当定义了一个有很多方法的类型时,十之八九你会使用 String() 方法来定制类型的字符串形式的输出,换句话说:一种可阅读性和打印性的输出。如果类型定义了 String() 方法,它会被用在 fmt.Printf() 中生成默认的输出:等同于使用格式化描述符 %v 产生的输出。还有 fmt.Print() 和 fmt.Println() 也会自动使用 String() 方法。代码packa...

2018-04-06 17:34:48 304

转载 多重继承

多重继承指的是类型获得多个父类型行为的能力,它在传统的面向对象语言中通常是不被实现的(C++ 和 Python 例外)。因为在类继承层次中,多重继承会给编译器引入额外的复杂度。但是在 Go 语言中,通过在类型中嵌入所有必要的父类型,可以很简单的实现多重继承。作为一个例子,假设有一个类型 CameraPhone,通过它可以 Call(),也可以 TakeAPicture(),但是第一个方法属于类...

2018-04-06 17:06:58 179

转载 如何在类型中嵌入功能

主要有两种方法来实现在类型中嵌入功能:A:聚合(或组合):包含一个所需功能类型的具名字段。B:内嵌:内嵌(匿名地)所需功能类型,像前一节 10.6.5 所演示的那样。为了使这些概念具体化,假设有一个 Customer 类型,我们想让它通过 Log 类型来包含日志功能,Log 类型只是简单地包含一个累积的消息(当然它可以是复杂的)。如果想让特定类型都具备日志功能,你可以实现一个这样的 L...

2018-04-06 16:25:17 218

转载 内嵌类型的方法和继承

概述 当一个匿名类型被内嵌在结构体中时,匿名类型的可见方法也同样被内嵌,这在效果上等同于外层类型 继承 了这些方法:将父类型放在子类型中来实现亚型。这个机制提供了一种简单的方式来模拟经典面向对象语言中的子类和继承相关的效果,也类似 Ruby 中的混入(mixin)。例子假定有一个 Engine 接口类型,一个 Car 结构体类型,它包含一个 Engine 类型的匿名字段:...

2018-04-04 23:54:12 463 1

转载 方法和未导出字段

考虑 person2.go 中的 person 包:类型 Person 被明确的导出了,但是它的字段没有被导出。例如在 use_person2.go 中 p.firstName 就是错误的。该如何在另一个程序中修改或者只是读取一个 Person 的名字呢?这可以通过面向对象语言一个众所周知的技术来完成:提供 getter 和 setter 方法。对于 setter 方法使用 Set 前...

2018-04-03 14:28:45 296

转载 指针或值作为接收者

鉴于性能的原因,recv 最常见的是一个指向 receiver_type 的指针(因为我们不想要一个实例的拷贝,如果按值调用的话就会是这样),特别是在 receiver 类型是结构体时,就更是如此了。 如果想要方法改变接收者的数据,就在接收者的指针类型上定义该方法。否则,就在普通的值类型上定义方法。 下面的例子 pointer_value.go 作了说明:change()接...

2018-04-03 14:06:12 178

转载 函数和方法的区别

函数将变量作为参数:Function1(recv)方法在变量上被调用:recv.Method1()在接收者是指针时,方法可以改变接收者的值(或状态),这点函数也可以做到(当参数作为指针传递,即通过引用调用时,函数也可以改变参数的状态)。不要忘记 Method1 后边的括号 (),否则会引发编译器错误:method recv.Method1 is not an expression, ...

2018-04-03 13:32:16 370

转载 方法

方法是什么 在 Go 语言中,结构体就像是类的一种简化形式,那么面向对象程序员可能会问:类的方法在哪里呢?在 Go 中有一个概念,它和方法有着同样的名字,并且大体上意思相同:Go 方法是作用在接收者(receiver)上的一个函数,接收者是某种类型的变量。因此方法是一种特殊类型的函数。 接收者类型可以是(几乎)任何类型,不仅仅是结构体类型:任何类型都可以有方法,甚至可以是函数类型,可...

2018-04-03 13:29:38 159

转载 匿名字段和内嵌结构体

定义结构体可以包含一个或多个 匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型就是字段的名字。匿名字段本身可以是一个结构体类型,即 结构体可以包含内嵌结构体。 可以粗略地将这个和面向对象语言中的继承概念相比较,随后将会看到它被用来模拟类似继承的行为。Go 语言中的继承是通过内嵌或组合来实现的,所以可以说,在 Go 语言中,相比较于继承,组合更受青睐考虑如下的...

2018-04-03 10:15:52 1262

转载 带标签的结构体

结构体中的字段除了有名字和类型外,还可以有一个可选的标签(tag):它是一个附属于字段的字符串,可以是文档或其他的重要标记。标签的内容不可以在一般的编程中使用,只有包 reflect 能获取它。我们将在下一章(第 11.10 节)中深入的探讨 reflect包,它可以在运行时自省类型、属性和方法,比如:在一个变量上调用 reflect.TypeOf() 可以获取变量的正确类型,如果变量是一个...

2018-04-03 10:06:27 473

转载 使用自定义包中的结构体

main.go 使用了一个结构体,它来自 struct_pack 下的包 structPack。package structPacktype ExpStruct struct { Mi1 int Mf1 float32}package mainimport ( "fmt" "./struct_pack/structPack")func ma...

2018-04-03 09:55:56 344

转载 使用工厂方法创建结构体实例

结构体工厂 Go 语言不支持面向对象编程语言中那样的构造子方法,但是可以很容易的在 Go 中实现 “构造子工厂”方法。为了方便通常会为类型定义一个工厂,按惯例,工厂的名字以 new 或 New 开头。假设定义了如下的 File 结构体类型:type File struct { fd int // 文件描述符 name string // 文件...

2018-04-03 09:24:06 184

转载 结构(struct)与方法(method)

概述 Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型。一个带属性的结构体试图表示一个现实世界中的实体。结构体是复合类型(composite types),当需要定义一个类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在一起。然后可以访问这些数据,就好像它是一个独立实体的一部分。结构体也是值类型,因此可以...

2018-04-03 08:59:21 1362

转载 将 map 的键值对调

这里对调是指调换 key 和 value。如果 map 的值类型可以作为 key 且所有的 value 是唯一的,那么通过下面的方法可以简单的做到键值对调。package mainimport ( "fmt")var ( barVal = map[string]int{"alpha": 34, "bravo": 56, "charlie": 23, ...

2018-03-30 10:38:58 2504

转载 map 的排序

map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序 如果你想为 map 排序,需要将 key(或者 value)拷贝到一个切片,再对切片排序,然后可以使用切片的 for-range 方法打印出所有的 key 和 value。// the telephone alphabet:package mainimport ( "fmt" "sort"...

2018-03-30 10:34:43 272

转载 map 类型的切片

假设我们想获取一个 map 类型的切片,我们必须使用两次 make() 函数,第一次分配切片,第二次分配 切片中每个 map 元素package mainimport "fmt"func main() { // Version A: items := make([]map[int]int, 5) for i:= range items { ...

2018-03-30 10:31:05 1263

转载 map for-range 的配套用法

可以使用 for 循环构造 map:for key, value := range map1 { ...}第一个返回值 key 是 map 中的 key 值,第二个返回值则是该 key 对应的 value 值;这两个都是仅 for 循环内部可见的局部变量。其中第一个返回值key值是一个可选元素。如果你只关心值,可以这么使用:for _, value := range map1...

2018-03-30 10:24:51 874

转载 测试键值对是否存在及删除元素

简述 测试 map1 中是否存在 key1: 在上一节中,我们已经见过可以使用 val1 = map1[key1] 的方法获取 key1 对应的值 val1。如果 map 中不存在 key1,val1 就是一个值类型的空值。 这就会给我们带来困惑了:现在我们没法区分到底是 key1 不存在还是它对应的 value 就是空值。 为了解决这个问题,我们可以这么用:val1, ...

2018-03-30 10:15:57 573

转载 声明、初始化和 make

概念map 是引用类型,可以使用如下声明:var map1 map[keytype]valuetypevar map1 map[string]int([keytype] 和 valuetype 之间允许有空格,但是 gofmt 移除了空格)在声明的时候不需要知道 map 的长度,map 是可以动态增长的。未初始化的 map 的值是 nil。key 可以是任意可以用 == ...

2018-03-30 10:10:21 323

转载 字符串、数组和切片的应用

从字符串生成字节切片 假设 s 是一个字符串(本质上是一个字节数组),那么就可以直接通过 c := []byte(s) 来获取一个字节的切片 c。另外,您还可以通过 copy 函数来达到相同的目的:copy(dst []byte, src string)。 同样的,还可以使用 for-range 来获得每个元素(Listing 7.13—for_string.go):pac...

2018-03-30 09:39:25 583

转载 切片的复制与追加

如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。下面的代码描述了从拷贝切片的 copy 函数和向切片追加新元素的 append 函数。package mainimport "fmt"func main() { sl_from := []int{1, 2, 3} sl_to := make([]int, 10) n := c...

2018-03-30 09:08:07 941

转载 切片重组(reslice)

我们已经知道切片创建的时候通常比相关数组小,例如:slice1 := make([]type, start_length, capacity) 其中 start_length 作为切片初始长度而 capacity 作为相关数组的长度。 这么做的好处是我们的切片在达到容量上限后可以扩容。改变切片长度的过程称之为切片重组 reslicing,做法如下:slice1 = slic...

2018-03-29 00:05:40 1192

转载 数组和切片

数组 Arrays概念 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的入参传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。初始化数组的初始化有多种形式[5] int {1,2,3,4,5}...

2018-03-28 23:45:12 3631

转载 For-range 结构

概述这种构建方法可以应用于数组和切片:for ix, value := range slice1 { ...} 第一个返回值 ix 是数组或者切片的索引,第二个是在该索引位置的值;他们都是仅在 for 循环内部可见的局部变量。value 只是 slice1 某个索引位置的值的一个拷贝,不能用来修改 slice1 该索引位置的值。例子package mai...

2018-03-27 11:10:34 600

转载 bytes 包

类型 []byte 的切片十分常见,Go 语言有一个 bytes 包专门用来解决这种类型的操作方法。 bytes 包和字符串包十分类似(参见第 4.7 节)。而且它还包含一个十分有用的类型 Buffer:import "bytes"type Buffer struct { ...} 这是一个长度可变的 bytes 的 buffer,提供 Read 和 Wri...

2018-03-27 10:57:03 334

转载 new() 和 make() 的区别

概念 看起来二者没有什么区别,都在堆上分配内存,但是它们的行为不同,适用于不同的类型。new(T) 为每个新的类型T分配一片内存,初始化为 0 并且返回类型为*T的内存地址:这种方法 返回一个指向类型为 T,值为 0 的地址的指针,它适用于值类型如数组和结构;它相当于 &T{}。make(T) 返回一个类型为 T 的初始值,它只适用于3种内建的引用类型:切片、map 和 ...

2018-03-27 10:33:22 1281

转载 切片

概念切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片是一个引用类型(因此更类似于 C/C++ 中的数组类型,或者 Python 中的 list 类型)。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。切片是可索引的,并且可以由 len() 函...

2018-03-27 10:23:27 218 1

MyEclipse黑色主题

亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用亲测可用

2018-03-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除