Go笔记-结构体
结构体简介
Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型,或者叫定制类型。一个带属性的结构体试图表示一个现实世界中的实体。结构体是复合类型(composite types),当需要定义一个类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在一起。然后可以访问这些数据,就好像它是一个独立实体的一部分。结构体也是值类型,因此可以通过 new 函数来创建。
组成结构体类型的那些数据称为 字段(fields)。每个字段都有一个类型和一个名字;在一个结构体中,字段名字必须是唯一的。
Go中没有类的概念
结构体定义
- 如果字段在代码中从来不会用到,那么就可以把它命名为_(单独使用下划线,在Go中表示忽略)
- 结构体的字段可以事任何类型,也可以是函数或是接口
type identifier struct{
field1 type1
field2 type2
...
}
// 声明
var s identifier
identifier.field1 = value
identifier.field2 = value
结构体声明
// 下面三种相同,t为结构体指针
var t *T // T是结构体类型
t = new(T) // 结构体指针变量t var t *T = new(T) t := new(T) // 指针变量t
结构体赋值和使用
import "fmt"
type struct1 {
i1 int
f1 float32
s1 string
}
func main(){
ms := new(struct1) // ms是*struct1类型
ms.i1 = 10 // 这是通过指针给结构体字段赋值,也可以通过解指针的方式给结构体赋值 这样子(*ms).i1 = 10
ms.f1 = 1.2
ms.s1 = "hello,word"
fmt.Println(ms.i1)
fmt.Println(ms.f1)
fmt.Println(ms.s1)
}
结构体初始化
// 方式一
ms:=&struct1{10,1.1,"gao"} // ms的类型是*struct1 // 方式二
var ms struct1
ms = struct1{10,1.1,"hu"} // ms的类型是ms
// 举例
type Interval struct{
start int
end int
}
// 以下三种初始化方式
intr := Interval{0,3}
intr := Interval{start:3,end:3}
intt := Interval{end:4}
结构体的内存分布


【结构体转换】
package main
type number struct{
a int
}
type aliasNumber number // 为结构体number定义了一个alias类型 aliasNumber
Go中实现构造方法
type File struct {
fd int // 文件描述符
name string // 文件名
}
fun newFile(fd int, name,string)*File{
if fd<0{
return nil
}
return &File{fd,name}
}
type matrix struct{
//
}
func NewMatrix(params)*matrix{
m := new(matrix)
return m
}
// 在其他包中引入使用
package main
import "matrix"
wrong := new(matrix.matrix) // wrong way
right := matrix.NewMatrix(...) // right way
带标签的结构体
结构体的字段除了有名字和类型外,还可以有一个可选的标签:它是附属于字段的字符串,可以是文档或其他的重要标记。标签的内容不可以在一般的编程中使用,只有反射包reflect能够获取它。
示例如下
package main import "fmt"
import "reflect" type TagType struct{
f1 bool "an important answer"
f2 string "the name of the thing"
f3 int "how much there are"
} fun main(){
tt := TagType{true,"kobe",82}
for i:=0;i<3,i++{
refTag(tt,i)
}
}
func refTag(tt TagType,ix int){
ttType := reflect.Typeof(tt)
ixField := ttType.Field(ix)
fmt.Printf("%v\n",ixField.Tag)
}
结构体中的匿名字段
结构体中可以包含一个或多个匿名字段(字段没有名字,只有类型,这个类型可以包括结构体类型),但是一个结构体中只能包含一种类型的匿名字段。比如不能同时包含两个int int匿名字段(结构体类型也是同样的道理)。
使用带有匿名字段的结构体时,类型名称就是字段名,这就是为什么一个类型只能出现一次了。
package main
import "fmt"
type struct1 struct{
f1 int
f2 bool
f3 string
float32
struct2
}
type struct2 struct{
s1 string
}
func main(){
s1 := new(struct1)
s1.f1 = 1
s1.f2 = true
s1.f3 = "boom"
s1.float32 = 2.3
s1.s1 = "childern"
fmt.Println(s1)
}
结构体中出现命名冲突
- 外层名字会覆盖内层名字(但是两者的内存空间都保留),这提供了一种重载字段或方法的方式
- 如果相同的名字在同一级别出现了两次,如果这个名字被程序使用了,将会引发错误。
如果想要使用内层的就通过层层去调用
package main import (
"fmt"
) type A struct {
a int
}
type B struct {
a int
b int
} type C struct {
A
B
} func main() {
var c_struct C
c_struct.A.a = 10
c_struct.b = 20
c_struct.B.a =30 fmt.Println(c_struct) }
Go笔记-结构体的更多相关文章
- 瘋子C语言笔记(结构体/共用体/枚举篇)
(一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name ...
- C语言学习笔记--结构体
结构体定义三种方式: #include<stdio.h> //第一种定义方法 struct point { int x; int y; }; struct point p1,p2; //第 ...
- 初学swift笔记 结构体(八)
import Foundation /* 和类很相似 结构体 -> 封装 属性.方法 结构体是值类型 */ //定义一个LSQ类型的结构体 关键字struct struct LSQ { var ...
- go学习笔记-结构体
结构体 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 定义 格式 type struct_variable_type struct { member definition; member ...
- C学习笔记-结构体
结构体的定义和初始化 结构体是简单数据类型的综合 struct man { char name[100]; int age; }; struct man m = { "tom", ...
- C学习笔记-结构体与二进制文件增删改查
使用结构体整理数据,然后利用二进制存储文件,这样存储的文件类似于数据库,可以实现文件的增删改查 定义结构体 struct student { unsigned int ID; char name[20 ...
- c语言学习笔记 - 结构体位域
在学习结构体的时候遇到了位域这个概念,位域主要是为了节省内存空间,比如用一个32位,4个字节的int存储一个开关变量时,会造成空间浪费,于是干脆就考虑在这个32划分不同的区域来存储数据,例如划出1位存 ...
- 15-C#笔记-结构体
示例: using System; using System.Text; struct Books { private string title; // 支持 public private strin ...
- swift学习笔记3——类、结构体、枚举
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
随机推荐
- 2017 Multi-University Training Contest - Team 1 1001&&HDU 6033 Add More Zero【签到题,数学,水】
Add More Zero Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- POJ2503-Babelfish-二分
Babelfish Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 44545 Accepted: 18803 Descr ...
- dede织梦怎么修改description的字数
织梦在调用描述的时候都会使用description来调用描述,想要更改字数也可以控制调用的字数,但是就算是这样更改也是有字数限制的,描述的字数是不能没有限制. 在模板中调用描述的标签一般有四种: 1: ...
- 【Asp.net Core】在 Linux 子系统中安装 nginx 并配置反向代理
上一篇鸟文中,老周已经介绍过在 Ubuntu 子系统中安装 dotnet-sdk 的方法,本文老周给大伙伴们说说安装 nginx 服务,并配置反向代理.同样,老周假设你从来没有用过 Linux,所以老 ...
- 6_css选择器
如何应用css样式? 找标签 写样式 如何找出标签? class选择器 .类名(注意前面点){ 样式 } .a{ color: green; } <p class="a"&g ...
- python_为被装饰的函数保留元数据
案例: 在函数对象中保存着一些函数的元数据,如: f.__name__ 函数名 f.__doc__ 函数文档 f.__moudle__ 函数所 ...
- 在CMainFrame里使用定时器是有讲究的
设置定时器函数:SetTimer 单位毫秒 销毁定时器函数:KillTimer 消息:WM_TIMER 注意事项: (1)不要在构造函数里设置定时器. (2)不要在析构函数里销毁定时器. 原因:构造函 ...
- 远程服务调用(RMI)
模块概念的引入,是本框架的一大优势,而跨JVM的远程服务调用则是另一个最有价值的功能. <本地服务调用>一文中我们讲解了跨模块间的服务调用可以是这样的: ServiceHelper.inv ...
- hibernate 基础
Hibernate:是开源的ORM框架技术,对jdbc进行了非常轻量级的对象封装,处于业务逻辑层和数据库层之间,称作持久化层. 持久化层的作用:把程序生成的对象持久化到数据库,也就是保存到数据库. ...
- SQL Server错误严重性级别和异常处理
关于SQL Server的错误严重性级别的说明,强烈认真看一下下面的两个链接 脱机帮助 ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/sqlerrm9/html/ ...