结构体类型

Go语言基础之结构体

纵然是瞬间 提交于 2019-12-05 01:44:59
Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。 类型别名和自定义类型 自定义类型 在Go语言中有一些基本的数据类型,如 string 、 整型 、 浮点型 、 布尔 等数据类型, Go语言中可以使用 type 关键字来定义自定义类型。 自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。例如: //将MyInt定义为int类型 type MyInt int 通过 Type 关键字的定义, MyInt 就是一种新的类型,它具有 int 的特性。 类型别名 类型别名是 Go1.9 版本添加的新功能。 类型别名规定: TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型 。就像一个孩子小时候有小名、乳名,上学后用学名,英语老师又会给他起英文名,但这些名字都指的是他本人。 type TypeAlias = Type 我们之前见过的 rune 和 byte 就是类型别名,他们的定义如下: type byte = uint8 type rune = int32 类型定义和类型别名的区别 类型别名与类型定义表面上看只有一个等号的差异,我们通过下面的这段代码来理解它们之间的区别。 //类型定义 type

golang中结构体的初始化方法(new方法)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-05 01:39:12
2019独角兽企业重金招聘Python工程师标准>>> 自定义一个结构体 type Rect struct { x, y float64 width, height float64 } 初始化方法: rect1 := new(Rect) rect2 := &Rect{} rect3 := &Rect{0, 0, 100, 200} rect4 := &Rect{width:100, height:200} 注意这几个变量全部为指向Rect结构的指针(指针变量),因为使用了new()函数和&操作符.而如果使用方法 a := Rect{} 则表示这个是一个Rect{}类型.两者是不一样的.参考代码: func main() { rect1 := &Rect{0, 0, 100, 200} rect1.x = 10 a := Rect{} a.x = 15 fmt.Printf("%v\n%T\n", a, a) fmt.Printf("%v\n%T\n", rect1, rect1) } 运行结果为: {15 0 0 0} main.Rect &{10 0 100 200} *main.Rect 从结果中可以清楚的看到两者的不同. 在Go语言中,未进行初始化的变量都会被初始化为该类型的零值,例如bool类型的零值为false, int类型的零值为0, string类型的零值为空字符串.

Go关键字--type

筅森魡賤 提交于 2019-12-05 01:34:59
type type有如下几种用法: 定义结构体 定义接口 类型定义 类型别名 类型查询 定义结构体 结构体是用户自定义的一种抽象的数据结构,golang中struct类似于java语言中的class, 在程序设计中,有着举足轻重的地位。结构体的用法,将会在struct关键字中详细的介绍。下边来看一下定义一个结构体的语法格式: type name struct { Field1 dataType Field2 dataType Field3 dataType } 定义接口 接口相关知识点,将会在interface关键字中详细介绍,下边来看一段定义接口的语法格式: type name interface{ Read() Write() } 类型定义 使用类型定义定义出来的类型与原类型不相同,所以不能使用新类型变量赋值给原类型变量,除非使用强制类型转换。下面来看一段示例代码,根据string类型,定义一种新的类型,新类型名称是name: type name string 为什么要使用类型定义呢? 类型定义可以在原类型的基础上创造出新的类型,有些场合下可以使代码更加简洁,如下边示例代码: package main import ( "fmt" ) // 定义一个接收一个字符串类型参数的函数类型 type handle func(str string) // exec函数

golang type关键字使用

霸气de小男生 提交于 2019-12-05 01:34:50
type是go语法里的重要而且常用的关键字,type绝不只是对应于C/C++中的typedef。搞清楚type的使用,就容易理解go语言中的核心概念struct、interface、函数等的使用。以下我用例子代码总结描述,请特别留意代码中的注释。 //1、定义结构体 //结构体定义 type person struct { name string //注意后面不能有逗号 age int } func main() { //结构体初始化 p := person{ name: "taozs" , //注意后面要加逗号 age: 18 , //或者下面的}提到这儿来可以省略逗号 } fmt.Println(p.name) } //初始化字段不一定要全部指定,比如下面也是可以的,name默认取长度为0的空字符串 p := person{ age: 18 , } //2、类型等价定义,相当于类型重命名 type name string name类型与string等价 例子: type name string func main() { var myname name = "taozs" //其实就是字符串类型 l := []byte(myname) //字符串转字节数组 fmt.Println(len(l)) //字节长度 } 不过,要注意的是,type绝不只是用于定义一系列的别名

Go 语言小记

一笑奈何 提交于 2019-12-05 01:00:52
本文主要是读 的笔记. 本文稍欠缺些整理. 简介 本节主要是对Go的一些主要内容进行基础的介绍 语法特点 变量类型的声明 类型放到变量名之后 函数可以返回多个变量 defer 可以延迟函数的调用(形成一个先进后出的defer栈) 存在指针类型,但没有指针运算 在定义变量时没有进行赋值,默认赋值为”零值”,数值类型默认为0,布尔类型默认为false字符串默认为空”” 支持类型推到 存在结构体 return 可以返回多个值以逗号分割 package main import "fmt" type MyStruct struct { x int y int } func main()( int , int ){ var a float64 = 1.0 var p * int s := MyStruct {1 ,2 } fmt.Println(s.x) i := &a j := 1 return i,j } 基本类型 bool string int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr byte // uint8 的别名 rune // int32 的别名 // 代表一个Unicode码 float32 float64 complex64 complex128 string 类型操作

go语言中type的几种使用

倖福魔咒の 提交于 2019-12-05 00:58:10
type是go语法里的重要而且常用的关键字,type绝不只是对应于C/C++中的typedef。搞清楚type的使用,就容易理解go语言中的核心概念struct、interface、函数等的使用。以下我用例子代码总结描述,请特别留意代码中的注释。 1、定义结构体 //结构体定义 type person struct { name string //注意后面不能有逗号 age int } func main() { //结构体初始化 p := person{ name: “taozs", //注意后面要加逗号 age: 18, //或者下面的}提到这儿来可以省略逗号 } fmt.Println(p.name) } //初始化字段不一定要全部指定,比如下面也是可以的,name默认取长度为0的空字符串 p := person{ age: 18, } 2、类型等价定义,相当于类型重命名 type name string name类型与string等价 例子: type name string func main() { var myname name = "taozs" //其实就是字符串类型 l := []byte(myname) //字符串转字节数组 fmt.Println(len(l)) //字节长度 } 不过,要注意的是,type绝不只是用于定义一系列的别名。

golang中的reflect包用法

拜拜、爱过 提交于 2019-12-05 00:43:58
最近在写一个自动生成api文档的功能,用到了reflect包来给结构体赋值,给空数组新增一个元素,这样只要定义一个input结构体和一个output的结构体,并填写一些相关tag信息,就能使用程序来生成输入和输出的相关文档。 介绍 reflect包是golang中很重要的一个包,实现了在运行时允许程序操纵任意类型对象的功能。可以看下 文档 简单了解一下。 在reflect中,最重要的是Value类,只有先获取到一个对象或者变量的Value对象后,我们才可以对这个对象或者变量进行更进一步的分析和处理。我们可以使用 reflect.ValueOf() 方法获取Value对象。 var i int value := reflect.ValueOf(i) // 使用ValueOf()获取到变量的Value对象 type S struct { a string } var s S value2 := reflect.ValueOf(s) // 使用ValueOf()获取到结构体的Value对象 获取到对象或者变量的Value对象后,我们就可以对他们进一步的操作了。 1.获取对象或者变量的类型(Value.Type()和Value.Kind()) Value.Type() 和 Value.Kind() 这两个方法都可以获取对象或者变量的类型,如果是变量的话,使用这两个方法获取到的类型都是一样

结构体对齐详解【转】

走远了吗. 提交于 2019-12-05 00:26:45
转自: https://www.cnblogs.com/motadou/archive/2009/01/17/1558438.html 1 -- 结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度。 比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个double类型数据就只需要一次内存操作。否则,我们就可能需要两次内存操作才能完成这个动作,因为数据或许恰好横跨在两个符合对齐要求的8字节内存块上。 2 -- 结构体对齐包括两个方面的含义 1)结构体总长度; 2)结构体内各数据成员的内存对齐,即该数据成员相对结构体的起始位置; 3 -- 结构体大小的计算方法和步骤 1)将结构体内所有数据成员的长度值相加,记为sum_a; 2)将各数据成员为了内存对齐,按各自对齐模数而填充的字节数累加到和sum_a上,记为sum_b。对齐模数是#pragma pack指定的数值以及该数据成员自身长度中数值较小者

C学习笔记(5)--- 指针第二部分,字符串,结构体。

纵饮孤独 提交于 2019-12-05 00:11:35
1. 函数指针(function pointer): 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。 函数指针变量的声明: typedef int (*fun_ptr)(int,int); 例子: https://www.runoob.com/cprogramming/c-fun-pointer-callback.html sub:指针函数是返回指针的函数,详见我上一篇文章。 2.回调函数(Callback function): 函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。 " 以下是来自知乎作者常溪玲的解说: 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。 " 意思简单来说就是:你现在定义的A函数的参数包含了一个你现在还不知道的B函数,所以你在参数中做了一个B函数指针以便引用这个B函数。 一旦引用的这个B函数被定义了

[Golang] 关于Sync.Map的使用

喜夏-厌秋 提交于 2019-12-04 23:50:28
简介: sync.Map这个数据结构是线程安全的(基本类型Map结构体在并发读写时会panic严重错误),它填补了Map线程不安全的缺陷,不过最好只在需要的情况下使用。它一般用于并发模型中对同一类map结构体的读写,或其他适用于sync.Map的情况。 关于sync.Map的源码解析文章: Go 1.9 sync.Map揭秘 正文: 它主要五个方法及其功能简介: 1、Store 存 key,value 2、LoadOrStore 取&存-具体看代码 3、Load 取key对应的value 4、Range 遍历所有的key,value 5、Delete 删除key,及其value package main import ( "fmt" "sync" ) func main() { var m sync.Map //Store m.Store(1,"a") m.Store(2,"b") //LoadOrStore //若key不存在,则存入key和value,返回false和输入的value v,ok := m.LoadOrStore("1","aaa") fmt.Println(ok,v) //false aaa //若key已存在,则返回true和key对应的value,不会修改原来的value v,ok = m.LoadOrStore(1,"aaa") fmt.Println