Golang教程:类型】的更多相关文章

在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike.baidu.com/link?url=Lrq57-YIZJ35grERvdg2kh7lfGfxvvLCVsNBMAqjBUOQX3CJUYnJp-9oZ2-rf3JGMqL3e4RbnSRQWs_5nmaI6K 枚举类型在C#或C++,java,VB等一些计算机编程语言中是一种基本数据类型而不是构…
目录 Golang - 复合类型 1. 指针 2. new()和make() 3. 数组 4. slice 5. Map 6. 结构体 7. 结构体参数 Golang - 复合类型 1. 指针 go语言中指针是很容易学习的,比C中容易的多,它可以更简单地执行一些任务 与变量类似,使用前需要声明,使用&符号可以取内存地址 声明指针的格式: var 指针变量名 *指针类型 指针的使用 //package 声明开头表示代码所属包 package main import "fmt" f…
总是用的用的就模糊了,不知道基本的类型有哪些,看来要反反复复弄几次. Golang基本类型整理 基本类型以及定义变量需要注意的 对于基本类型的介绍,感觉这个博客讲的比较透彻,基本上都是从源码的角度来入手分析的,自己并没有理解到这么深入的程度,这里跟着文章过一下,挑一些主要的部分记录一下. 在go语言中,数据类型分为静态类型和底层类型,感觉底层类型是golang实现的时候所使用的c语言的类型,而静态类型仅仅是针对于go语言本身而言所定义好的类型.具体的信息可以查看$GOROOT/src/runti…
下面是 Go 支持的基本类型: bool Numeric Types  int8, int16, int32, int64, int uint8,uint16,uin32,uint64, uint float32, float64 complex64, complex128 byte rune string bool bool 类型表示真假值,只能为 true 或 false. import "fmt" func main() { var a bool = true b := fals…
声明单一变量 声明一个变量的语法为:var name type,例如 package main import "fmt" func main() { var age int // variable declaration fmt.Println("my age is", age) } 语句 var age int 声明了一个类型为 int,名称为 age 的变量.在这里我们没有给它赋任何值.如果一个变量没有被赋予任何值,Go 会自动将这个变量初始化为其类型的 0值,…
在golang中空的interface即interface{}可以看作任意类型, 即C中的void *. 对interface{}进行类型测试有2种语法: 1. Comma-ok断言: value, ok = element.(T), 其中T是具体类型. 2. Switch测试: switch element.(type) { case T1: case T2: default: } 其中T1, T2是具体类型. 注意: element.(type)语法不能在switch外的任何逻辑里使用. 在…
sort包中提供了很多排序算法,对自定义类型进行排序时,只需要实现sort的Interface即可,包括: func Len() int {... } func Swap(i, j int) {... } func Less(i, j int) bool {... } 使用方法举例如下: package main import ( "fmt" "sort" ) type Person struct { Name string Age int } func (p Pe…
Objective-C编程语言提供了一个名称为typedef的关键字,可以使用此关键字为类型指定新名称. 以下是为单字节数字定义术语BYTE的示例 - typedef unsigned char BYTE; 在此类型定义之后,标识符BYTE可以用作unsigned char类型的缩写(或别名),例如: typedef unsigned char BYTE; BYTE b1, b2; 按照惯例,大写字母用于这些定义,以提醒用户类型名称实际上是符号缩写,但可以使用小写,如下所示 - typedef…
什么是 map? Map 是 Go 中的内置类型,它将键与值绑定到一起.可以通过键获取相应的值. 如何创建 map? 可以通过将键和值的类型传递给内置函数 make 来创建一个 map.语法为:make(map[KeyType]ValueType).(译者注:map 的类型表示为 map[KeyType]ValueType)例如: personSalary := make(map[string]int) 上面的代码创建了一个名为 personSalary 的 map.其中键的类型为 string…
数组 数组是类型相同的元素的集合.例如,整数 5, 8, 9, 79, 76 的集合就构成了一个数组.Go不允许在数组中混合使用不同类型的元素(比如整数和字符串). 声明 var variable_name [SIZE] variable_type 有很多声明数组的方式,让我们一个一个地介绍. package main import ( "fmt" ) func main() { ]int //int array with length 3 fmt.Println(a) } var a…
定义常量 常量(constant)表示固定的值,比如:5,-89,"I love Go",67.89 等等. 考虑如下程序: var b string = "I love Go" 上面的程序中, a 和 b 分别被赋值为常量 50 和 "I love Go".关键字 const 用于指示常量,如 50 和 "I love Go".在上面的代码中,尽管没有使用关键字 const 修饰 50 与 "I love Go&q…
在上一篇教程中,我们讨论了如何使用协程实现并发.在这篇教程中,我们将讨论信道以及如何使用信道实现协程间通信. 什么是信道 信道(Channel)可以被认为是协程之间通信的管道.与水流从管道的一端流向另一端一样,数据可以从信道的一端发送并在另一端接收. 声明信道 每个信道都有一个与之关联的类型.此类型是允许信道传输的数据类型,除此类型外不能通过信道传输其他类型. chan T 是一个 T 类型的信道. 信道的 0 值为 nil.值为 nil 的信道变量没有任何用处,我们需要通过内置函数 make …
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第五篇,这一篇我们将会了解golang中的数组和切片的使用. 数组与切片 golang当中数组和C++中的定义类似,除了变量类型写在后面. 比如我们要声明一个长度为10的int型的数组,会写成这样: var a [10]int 数组的长度定义了之后不能改变,这点和C++以及Java是一样的.但是在我们日常使用的过程当中,除非我们非常确定数组长度不会发生变化,否则我们一般不会使用数组,而是使用切片(slice).…
接口类型变量的内存结构 动态类型 动态值 对于动态类型指的是当其他非接口类型变量赋值给接口类型变量时,接口类型变量中的动态类型就是当前非接口类型 对于动态值指的就是当其他非接口类型变量赋值给接口类型变量时,接口类型变量中的动态值就是当前非接口类型变量值的副本 对于接口变量对应的就是runtime2.go中的iface type iface struct { tab *itab data unsafe.Pointer } 对于接口类型变量和接口实现类型变量对比,如果接口类型变量的动态类型和接口实现…
类型方法 1. 给类型定义方法 在Go语言中,我们可以给任何类型(包括内置类型,但不包括指针和接口)定义方法.例如,在实际编程中,我们经常使用[ ]byte的切片,我们可以定义一个新的类型: type ByteSlice []byte 然后我们就可以定义方法了.例如,假如我们不想使用内建的append函数,我们可以实现一个自己的append方法: func Append(slice, data[]byte) []byte {     l := len(slice)     if l + len(…
inter 是interface类型,转化为string类型是: str := inter .(string) 转为其他类型也类似…
类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式: y, ok := x.(type) 上面的语句用于判断变量x是不是type类型,有两种结果: x是type类型的变量,那么返回x的副本赋值给y,ok的值为true x不是type类型的变量,那么返回一个空的stuct,ok的值为false 注意判断x是不是type类型的变量时,那么  type类型的结构(struct)  就必须实现  x类型的接口,否则进行类型断言是不合法的. 看一个完整的示例: packag…
基础知识--类型与变量 基本类型 布尔型:bool 长度: 1字节 取值范围: false, true 注意事项: 不可以使用数字代表,不像 python中可是使用 1和0表示 整型: int/uint 根据运行平台可能是32位或者是64位 8位整型: int8/uint8 长度:1字节 取值范围: 128~127(有运算符号) 0-255 无符号 字节型: byte (uint8别名) 16位整型:int16/uint16 长度:2字节 取值范围: -32768~32767 / 0~65536…
1.变量 Go使用关键字var定义变量,类型信息放在变量名后面,初始化为零,如下: 在函数内部还有一种更简洁的:=定义方式 变量赋值,两个变量可直接交换 注意:函数内部定义的变量没使用的话编译器会报错. declared and not used 2 常量 用关键词const定义,常量值必须是编译期间能够确定的数值. 枚举iota,从0开始按行数自增,如果重新const,则从0开始再次计算. 3 类型 Go内置以下基础类型: 布尔类型:bool. 整型:int8.byte.int16.int.u…
什么是接口 在面向对象语言中,接口一般被定义为 :接口定义了一个对象的行为.它仅仅指定了一个对象应该做什么.具体怎么做(实现细节)是由对象决定的. 在 Go 中,一个接口定义为若干方法的签名.当一个类型定义了所有接口里的方法时,就说这个类型实现了这个接口.这和 OOP 很像.接口指定了一个类型应该包含什么方法,而该类型决定怎么实现这些方法. 比如 WashingMachine可以作为一个接口,并提供两个函数 Cleaning() 和 Drying().任何提供了 Cleaning() 和 Dry…
什么是方法 一个方法只是一个函数,它有一个特殊的接收者(receiver)类型,该接收者放在 func 关键字和函数名之间.接收者可以是结构体类型或非结构体类型.可以在方法内部访问接收者. 通过下面的语法创建一个方法: func (t Type) methodName(parameter list) { } 上面的代码片段创建了一个名为 methodName 的方法,该方法有一个类型为 Type 的接收者. 例子 让我们编写一个简单的程序,它创建一个结构体类型的方法并调用它. package m…
结构体(struct)是用户自定义的类型,它代表若干字段的集合.有些时候将多个数据看做一个整体要比单独使用这些数据更有意义,这种情况下就适合使用结构体. 比如将一个员工的 firstName, lastName 和 age 三个属性打包在一起成为一个 employee 结构就是很有意义的. 结构体的声明 type Employee struct { firstName string lastName string age int } 上面的代码片段声明了一个名为 Employee 的结构体类型,…
什么是指针 指针是存储一个变量的内存地址的变量. 在上图中,变量 b 的值是 156,存储在地址为 0x1040a124 的内存中.变量 a 存储了变量 b 的地址.现在可以说 a 指向b. 指针的声明 一个指针变量指向了一个值的内存地址. 类似于变量和常量,在使用指针前你需要声明指针.指针声明格式如下: var var_name *var-type var-type 为指针类型,var_name 为指针变量名,* 号用于指定变量是作为一个指针.以下是有效的指针声明: var ip *int /…
switch 是一个条件语句,用于将一个表达式的求值结果与可能的值的列表进行匹配,并根据匹配结果执行相应的代码.可以认为 switch 语句是编写多个 if-else 子句的替代方式. 举例是说明问题最好的方式,让我们写一个简单的程序,输入手指编号,输出对应的手指名称:).例如 0 表示拇指,1 表示食指等. package main import ( "fmt" ) func main() { finger := switch finger { : fmt.Println("…
什么是包?为什么使用包? 到目前为止我们见到的 Go 程序都只有一个文件,文件中包含了一个main函数和几个其他函数.在实际中这种将所有代码都放在一个文件里的组织方式是不可行的.这样的组织方式使得代码变得无法重用和维护困难.包(package)用于解决这样的问题. 包用于组织Go源代码,以获得更好的重用性和可读性.包提供了代码封装的机制从而使得Go应用程序易于维护.例如,假设我们正在开发一个图像处理应用,它提供了诸如图像裁剪,锐化,模糊和增色等功能.一种组织代码的方式是将所有实现同一功能的代码放…
函数是完成一个特定任务的代码块.一个函数接受输入,对输入进行一些运算并产生输出. 函数声明 在 Go 中声明一个函数的语法为: func functionname(parametername type) returntype { //function body } 函数声明以关键字 func 开头,后面是函数名字,接着是在 ( 和 ) 之间指定的参数列表,然后是函数的返回类型.指定参数的语法为参数名称后面跟着参数类型.可以指定任意数量的参数,形式为: (parameter1 type, para…
在上一篇中,我们讨论了并发,以及并发和并行的区别.在这篇教程中我们将讨论在Go中如何通过Go协程实现并发. 什么是协程 Go协程(Goroutine)是与其他函数或方法同时运行的函数或方法.可以认为Go协程是轻量级的线程.与创建线程相比,创建Go协程的成本很小.因此在Go中同时运行上千个协程是很常见的. Go协程对比线程的优点 与线程相比,Go协程的开销非常小.Go协程的堆栈大小只有几kb,它可以根据应用程序的需要而增长和缩小,而线程必须指定堆栈的大小,并且堆栈的大小是固定的. Go协程被多路复…
在处理一些参数的时候,可能需要将参数转换为各种类型,这里实现一个通用的转换函数,实现各种类型之间的相互转换. 当然,如果源数据格式和目标数据类型不一致,是会返回错误的.例如将字符串“一二三”转换为数值类型则会报错,而将字符串“123”转换为数值类型则OK. 这段代码实际抄自go自带的“database/sql”库,只是源代码作为内部函数无法在外面调用,可以单独把需要的功能拎出来使用: 代码中有一个Scaner接口,可以自行实现,然后通过"convertAssign()"函数,作为dst…
综述 变量声明时未赋初值,则变量被自动赋值为该类型的零值(固定值) func new(Type) *Type new()返回一个指针,指向新分配的该类型的零值,不是空指针(nil).the value returned is a pointer to a newly allocated zero value of that type. func make(t Type, size ...IntegerType) Type make()只适用于slice.map.chan,此三种类型创建时推荐使用…
对于指针类型不安全编程,通过指针值以及偏移量操作slice私有属性 // 通过指针值获取切片 func TestGetPrivate(t *testing.T) { s := []int{1, 2, 3} sptr := uintptr(unsafe.Pointer(&s)) // 获取当前结构体实例的指针值 t.Log(sptr) arrPtr := (*[]int)(unsafe.Pointer(sptr))// 对于slice结构体而言,第一个属性就是数组指针类型 arr := *arrP…