go-结构体和方法
结构体类型的字面量由关键字type、类型名称、关键字struct,以及由花括号包裹的若干字段声明组成。
type Person struct {
Name string
Gender string
Age uint8
}
Person{Name: "Robert", Gender: "Male", Age: }
键值对的顺序与其类型中的字段声明完全相同的话,我们还可以统一省略掉所有字段的名称
Person{"Robert", "Male", }
结构体类型的值字面量时可以只对它的部分字段赋值,甚至不对它的任何字段赋值。
这时,未被显式赋值的字段的值则为其类型的零值。
上述情况下,字段的名称是不能被省略的。
匿名结构体
编写一个结构体值的字面量时不需要先拟好其类型。这样的结构体字面量被称为匿名结构体。
与匿名函数类似,我们在编写匿名结构体的时候需要先写明其类型特征(包含若干字段声明),再写出它的值初始化部分。
p := struct {
Name string
Gender string
Age uint8
}{"Robert", "Male", }
匿名结构体最大的用处就是在内部临时创建一个结构以封装数据,而不必正式为其声明相关规则。
而在涉及到对外的场景中,我强烈建议使用正式的结构体类型。
结构体类型可以拥有若干方法(注意,匿名结构体是不可能拥有方法的)
所谓方法,其实就是一种特殊的函数。它可以依附于某个自定义类型。
方法的特殊在于它的声明包含了一个接收者声明。
这里的接收者指代它所依附的那个类型。名为Grow的方法的声明:
func (person *Person) Grow() {
person.Age++
}
p := Person{"Robert", "Male", }
p.Grow()
最后,结构体类型属于值类型。
它的零值并不是nil,而是其中字段的值均为相应类型的零值的值。
结构体类型Person的零值若用字面量来表示的话则为Person{}。
package main import (
"fmt"
) type Persion struct {
name string
age int
sex byte
} type Student struct {
Persion //结构体匿名字段,只有类型,没有名字,匿名字段,继承了Persion的成员
int //基础类匿名字段
id int
addr string
name string
} func main() {
//直接定义一个对象
var xx Student
xx.name = "xiao x" //结构体中的其他结构体同名字成员变量, 需显示的调用赋值
xx.Persion.name = "xiao xie"
xx.age =
fmt.Println(xx) //顺序初始化,匿名变量的初始化
var xiaoming Student = Student{Persion{"xiaoming", , 'm'}, , , "201 Room", "xx"}
fmt.Println(xiaoming) //可直接使用匿名对象的类型
fmt.Println(xiaoming.int) //自动推导
xiaofang := Student{Persion{"xiaofang", , 'f'}, , , "401 Room", "xx"}
fmt.Println(xiaofang) //指定成员初始化
s3 := Student{Persion: Persion{"xiaofang", , 'm'}}
fmt.Println(s3)
s4 := Student{addr: "203 Room"}
fmt.Println(s4) }
type Student struct {
*Persion //指针类型匿名字段
} func main() {
//方式1
var xiaoming Student = Student{&Persion{"xiaoming2", , 'm'}}
fmt.Println(xiaoming.name) //方式2
var xiaofang Student
xiaofang.Persion = new(Persion)
xiaofang.Persion.name = "xiaofang"
fmt.Println(xiaofang.Persion.name)
}
//带有接收者的方法叫成员函数
func (p Persion) PrintName() {
fmt.Println(p)
} //指针接收者
func (p *Persion) setName(str string) {
p.name = str
} func main() {
var p Persion = Persion{"xiaoming", , 'M'}
p.PrintName()
(&p).setName("xiaof")
p.PrintName()
}
go-结构体和方法的更多相关文章
- 六、golang中的结构体和方法、接口
结构体: 1.用来自定义复杂数据结构 2.struct里面可以包含多个字段(属性) 3.struct类型可以定义方法,注意和函数的区分 4.strucr类型是值类型 5.struct类型可以嵌套 6. ...
- Go part 5 结构体,方法与接收器
结构体 结构体定义 结构体的定义只是一种内存布局的描述(相当于是一个模板),只有当结构体实例化时,才会真正分配内存空间 结构体是一种复合的基本类型,通过关键字 type 定义为 自定义 类型后,使结构 ...
- go结构体的方法和普通函数
package main import ( "fmt" "math" ) type vertex struct { X, Y float64 } //值接收者是 ...
- go 结构体与方法
go 结构体与方法 go 结构体相当于 python 中类的概念,结构体用来定义复杂的数据结构,存储很多相同的字段属性 结构体的定义 1.结构体的定义以及简单实用 package main imp ...
- go结构体与方法
go结构体相当于python中类的概念 结构体用来定义复杂的数据结构,存储很多相同的字段属性 1.结构体的定义以及简单实用 package main import ( "fmt" ...
- Go 语言 结构体和方法
@ 目录 1. 结构体别名定义 2. 工厂模式 3. Tag 原信息 4. 匿名字段 5. 方法 1. 结构体别名定义 变量别名定义 package main import "fmt&quo ...
- Go基础之--结构体和方法
结构体的定义 结构体是将零个或者多个任意类型的命令变量组合在一起的聚合数据类型.每个变量都叫做结构体的成员. 其实简单理解,Go语言的结构体struct和其他语言的类class有相等的地位,但是GO语 ...
- go的基结构体如何使用派生结构体的方法
将派生类的方法声明为接口嵌入到基结构体中,派生结构体声明该接口为自身.
- go_结构体和方法
面向对象:go语言仅支持封装不支持继承和多态 所以go语言没有class,只有struct(结构体) 无论地址还是结构本身,一律用 . 来访问成员 go语言编译器可以自动区分是值传递还是指针传递,值传 ...
- Go语言 6 结构体、方法和接口
文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ Go学习群:415660935 结构体(struct)是由一系列具有相同类型或不同类 ...
随机推荐
- 第五场周赛(字符串卡常个人Rank赛)——题解
本次题目因为比较简单,除了个别题目,其余题目我只写一个思路不再贴代码. 先是Div.2的题解 A题奇怪的优化,把递归函数改成2*fun(...)即可,其实看懂程序也不难,就是求a*2b: B题你会st ...
- IO流的工具类
1.需要先导入jar包: FilenameUtils import org.apache.commons.io.FilenameUtils; public class FilenameUtilesDe ...
- 创建进程池与线程池concurrent.futures模块的使用
一.进程池. 当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量就应该考虑去 限制进程数或线程数,从而保证服务器不会因超载而瘫痪.这时候就出现了进程池和线程池. 二.conc ...
- 6.Sentinel源码分析—Sentinel是如何动态加载配置限流的?
Sentinel源码解析系列: 1.Sentinel源码分析-FlowRuleManager加载规则做了什么? 2. Sentinel源码分析-Sentinel是如何进行流量统计的? 3. Senti ...
- Linux Centos7部署环境安装-CentOS
Linux Centos7部署环境安装-CentOS Centos7部署环境安装及Linux常用命令 centos系统下各文件夹的作用 centos7修改系统默认语言 centos7安装rz/sz命令 ...
- abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理二 (二十)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- python + selenium 环境搭建及问题
搭建平台windows 准备工具如下: ------------------------------------------------------------- 下载python https://w ...
- docker容器添加对外映射端口
一般在运行容器时,我们都会通过参数 -p(使用大写的-P参数则会随机选择宿主机的一个端口进行映射)来指定宿主机和容器端口的映射,例如 docker run -it -d --name [contain ...
- Mybatis面试题吐血总结
高强度训练第二十天总结:Mybatis面试题 什么是Mybatis? Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力 ...
- 死磕 java线程系列之创建线程的8种方式
(手机横屏看源码更方便) 问题 (1)创建线程有哪几种方式? (2)它们分别有什么运用场景? 简介 创建线程,是多线程编程中最基本的操作,彤哥总结了一下,大概有8种创建线程的方式,你知道吗? 继承Th ...