Go - Struct
定义
go 语言中的struct与c的很相似,此外,go没有Class,也没有继承。
stuct的格式为:type <name> struct{}
- package main
- import (
- "fmt"
- )
- type person struct {
- Name string
- Age int
- }
- func main() {
- p := person{
- Name: "Tony",
- Age: ,
- }
- fmt.Println(p)
- }
//output
{Tony 23}
Struct是值类型
- package main
- import (
- "fmt"
- )
- type person struct {
- Name string
- Age int
- }
- func ChangeAge(per person) {
- per.Age =
- fmt.Printf("Call 'Change Age' function, new age is %d \n", per.Age)
- }
- func main() {
- p := person{
- Name: "Tony",
- Age: ,
- }
- fmt.Println(p)
- ChangeAge(p)
- fmt.Println(p)
- }
- //output
- {Tony }
- Call 'Change Age' function, new age is
- {Tony }
我们可以看到,age属性只在func内部被修改,因此可以确定struct是值类型(传递给函数的参数为值的一个copy)
如何传递引用?
我们可以将函数的参数类型定义称为“一个指针”,即可
- package main
- import (
- "fmt"
- )
- type person struct {
- Name string
- Age int
- }
- func ChangeAge(per *person) {
- per.Age =
- fmt.Printf("Call 'Change Age' function, new age is %d \n", per.Age)
- }
- func main() {
- p := person{
- Name: "Tony",
- Age: ,
- }
- fmt.Println(p)
- ChangeAge(&p)
- fmt.Println(p)
- }
- //output
- {Tony }
- Call 'Change Age' function, new age is
- {Tony }
struct中的匿名字段
go 语言中,支持在struct中省略字段的名称,只保留其类型(匿名字段)
- package main
- import (
- "fmt"
- )
- type person struct {
- string
- int
- }
- func main() {
- p := person{
- "Bob",
- ,
- }
- fmt.Println(p)
- }
- // output
- {Bob }
匿名结构
go语言中,也支持定义匿名结构。
- package main
- import (
- "fmt"
- )
- func main() {
- p := struct {
- Name string
- Age int
- Sex string
- }{
- Name: "Joe",
- Age: ,
- Sex: "female",
- }
- fmt.Println(p)
- }
- //output
- {Joe female}
使用嵌入字段来“模拟”继承关系
- package main
- import (
- "fmt"
- )
- type person struct {
- Sex string
- }
- type teacher struct {
- person
- Name string
- Age int
- }
- func main() {
- t := teacher{
- person: person{Sex: "feamle"},
- Name: "Jill",
- Age: ,
- }
- fmt.Println(t)
- t.Age =
- t.Name = "Criss"
- t.person.Sex = "male"
- fmt.Println(t)
- }
- //output
- {{feamle} Jill }
- {{male} Criss }
Go - Struct的更多相关文章
- 使用struct处理二进制
有的时候需要用python处理二进制数据,比如,存取文件.socket操作时.这时候,可以使用python的struct模块来完成. struct模块中最重要的三个函数是pack(), unpack( ...
- golang struct扩展函数参数命名警告
今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...
- go-使用 unsafe 修改 struct 中的 field 的值
以下是方法,不要纠结原理,等东西积累多了,你才有能力纠结原理: 首先,你需要有一个这样的函数,这是在 nsq 的源码里直接抄过来的: func unsafeValueOf(val reflect.Va ...
- C语言中struct位域的定义和使用
位域的定义和使用 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又 ...
- C# Struct结构体里数组长度的指定
typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...
- C 语言Struct 实现运行类型识别 RTTI
通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型. (2)dynamic_cast: ...
- VC++ : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>
最近学习Google Breakpad,将其用在了自己的项目中,编译的版本为VS2010,没有什么问题.但是为了和之前的程序兼容,需要使用VS2008版本的程序,于是又编译了VS2008版本的代码,但 ...
- 字节流与数据类型的相互转换---使用struct模块
字节流与数据类型的相互转换---使用struct模块 http://blog.csdn.net/Sunboy_2050/article/details/5974029 Python是一门非常简洁的语言 ...
- 窥探Swift之别具一格的Struct和Class
说到结构体和类,还是那句话,只要是接触过编程的小伙伴们对这两者并不陌生.但在Swift中的Struct和Class也有着令人眼前一亮的特性.Struct的功能变得更为强大,Class变的更为灵活.St ...
- struct 大小计算
结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率.在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员 ...
随机推荐
- python爬虫实战(一)--------中国作物种质信息网
相关代码已经修改调试成功----2017-4-1 目标网址:http://www.cgris.net/query/croplist.php 实现:爬取相关信息如图所示,爬取的数据存入mysql数据库. ...
- 【Egret】里使用audio标签达到默认播放背景音乐
方法一 <audio id="bgmMusic" style="position:absolute;" src="resource/assets ...
- JAVA加密算法系列-BASE64
package ***; import java.io.IOException; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encode ...
- centos7安装nagios步骤
一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...
- MongoDB基础教程系列--第七篇 MongoDB 聚合管道
在讲解聚合管道(Aggregation Pipeline)之前,我们先介绍一下 MongoDB 的聚合功能,聚合操作主要用于对数据的批量处理,往往将记录按条件分组以后,然后再进行一系列操作,例如,求最 ...
- Coordinator节点
Coordinator节点 Coordinator 节点主要负责segment 的管理和分配.更具体的说,它同通过配置往historical 节点 load 或者 drop segment .Coo ...
- 借助case,实现更丰富的分组查询统计
根据fileD6的前4位分组 分别统计该组 5种企业类型fileD31的数量 create or replace view jyjc_bycity as select substr(fileD ...
- virtual box ubuntu 主机和虚拟机实现互相复制粘贴
链接:http://jingyan.baidu.com/article/574c521917db806c8d9dc18c.html 常规高级里共享粘贴板已经选中双向,(我的已经可以了复制粘贴了),如果 ...
- java复习(8)---I/O
本节复习java常用i/o,输入输出流. 先放上样例代码.方便参考,可以轻松看懂. package re08; import java.io.*; import java.util.Scanner; ...
- HYML / CSS和Javascript 部分
1 CSS实现垂直水平居中 HTML结构: <div class="wrapper"> <div class="content">&l ...