定义

go 语言中的struct与c的很相似,此外,go没有Class,也没有继承。

stuct的格式为:type <name> struct{}

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type person struct {
  8. Name string
  9. Age int
  10. }
  11.  
  12. func main() {
  13. p := person{
  14. Name: "Tony",
  15. Age: ,
  16. }
  17. fmt.Println(p)
  18. }
    //output
    {Tony 23}

Struct是值类型

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type person struct {
  8. Name string
  9. Age int
  10. }
  11.  
  12. func ChangeAge(per person) {
  13. per.Age =
  14. fmt.Printf("Call 'Change Age' function, new age is %d \n", per.Age)
  15. }
  16.  
  17. func main() {
  18. p := person{
  19. Name: "Tony",
  20. Age: ,
  21. }
  22. fmt.Println(p)
  23. ChangeAge(p)
  24. fmt.Println(p)
  25. }
  26.  
  27. //output
  28. {Tony }
  29. Call 'Change Age' function, new age is
  30. {Tony }

我们可以看到,age属性只在func内部被修改,因此可以确定struct是值类型(传递给函数的参数为值的一个copy)

如何传递引用?

我们可以将函数的参数类型定义称为“一个指针”,即可

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type person struct {
  8. Name string
  9. Age int
  10. }
  11.  
  12. func ChangeAge(per *person) {
  13. per.Age =
  14. fmt.Printf("Call 'Change Age' function, new age is %d \n", per.Age)
  15. }
  16.  
  17. func main() {
  18. p := person{
  19. Name: "Tony",
  20. Age: ,
  21. }
  22. fmt.Println(p)
  23. ChangeAge(&p)
  24. fmt.Println(p)
  25. }
  26.  
  27. //output
  28. {Tony }
  29. Call 'Change Age' function, new age is
  30. {Tony }

struct中的匿名字段

go 语言中,支持在struct中省略字段的名称,只保留其类型(匿名字段)

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type person struct {
  8. string
  9. int
  10. }
  11.  
  12. func main() {
  13. p := person{
  14. "Bob",
  15. ,
  16. }
  17. fmt.Println(p)
  18. }
  19.  
  20. // output
  21. {Bob }

匿名结构

go语言中,也支持定义匿名结构。

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. func main() {
  8. p := struct {
  9. Name string
  10. Age int
  11. Sex string
  12. }{
  13. Name: "Joe",
  14. Age: ,
  15. Sex: "female",
  16. }
  17. fmt.Println(p)
  18. }
  19.  
  20. //output
  21. {Joe female}

使用嵌入字段来“模拟”继承关系

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. )
  6.  
  7. type person struct {
  8. Sex string
  9. }
  10.  
  11. type teacher struct {
  12. person
  13. Name string
  14. Age int
  15. }
  16.  
  17. func main() {
  18. t := teacher{
  19. person: person{Sex: "feamle"},
  20. Name: "Jill",
  21. Age: ,
  22. }
  23. fmt.Println(t)
  24.  
  25. t.Age =
  26. t.Name = "Criss"
  27. t.person.Sex = "male"
  28. fmt.Println(t)
  29. }
  30.  
  31. //output
  32. {{feamle} Jill }
  33. {{male} Criss }

Go - Struct的更多相关文章

  1. 使用struct处理二进制

    有的时候需要用python处理二进制数据,比如,存取文件.socket操作时.这时候,可以使用python的struct模块来完成. struct模块中最重要的三个函数是pack(), unpack( ...

  2. golang struct扩展函数参数命名警告

    今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...

  3. go-使用 unsafe 修改 struct 中的 field 的值

    以下是方法,不要纠结原理,等东西积累多了,你才有能力纠结原理: 首先,你需要有一个这样的函数,这是在 nsq 的源码里直接抄过来的: func unsafeValueOf(val reflect.Va ...

  4. C语言中struct位域的定义和使用

    位域的定义和使用 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又 ...

  5. C# Struct结构体里数组长度的指定

    typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...

  6. C 语言Struct 实现运行类型识别 RTTI

    通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型.    (2)dynamic_cast: ...

  7. 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版本的代码,但 ...

  8. 字节流与数据类型的相互转换---使用struct模块

    字节流与数据类型的相互转换---使用struct模块 http://blog.csdn.net/Sunboy_2050/article/details/5974029 Python是一门非常简洁的语言 ...

  9. 窥探Swift之别具一格的Struct和Class

    说到结构体和类,还是那句话,只要是接触过编程的小伙伴们对这两者并不陌生.但在Swift中的Struct和Class也有着令人眼前一亮的特性.Struct的功能变得更为强大,Class变的更为灵活.St ...

  10. struct 大小计算

    结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率.在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员 ...

随机推荐

  1. python爬虫实战(一)--------中国作物种质信息网

    相关代码已经修改调试成功----2017-4-1 目标网址:http://www.cgris.net/query/croplist.php 实现:爬取相关信息如图所示,爬取的数据存入mysql数据库. ...

  2. 【Egret】里使用audio标签达到默认播放背景音乐

    方法一 <audio id="bgmMusic" style="position:absolute;" src="resource/assets ...

  3. JAVA加密算法系列-BASE64

    package ***; import java.io.IOException; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encode ...

  4. centos7安装nagios步骤

    一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...

  5. MongoDB基础教程系列--第七篇 MongoDB 聚合管道

    在讲解聚合管道(Aggregation Pipeline)之前,我们先介绍一下 MongoDB 的聚合功能,聚合操作主要用于对数据的批量处理,往往将记录按条件分组以后,然后再进行一系列操作,例如,求最 ...

  6. Coordinator节点

    Coordinator节点 Coordinator 节点主要负责segment 的管理和分配.更具体的说,它同通过配置往historical 节点 load 或者 drop  segment .Coo ...

  7. 借助case,实现更丰富的分组查询统计

    根据fileD6的前4位分组    分别统计该组  5种企业类型fileD31的数量 create or replace view jyjc_bycity as select substr(fileD ...

  8. virtual box ubuntu 主机和虚拟机实现互相复制粘贴

    链接:http://jingyan.baidu.com/article/574c521917db806c8d9dc18c.html 常规高级里共享粘贴板已经选中双向,(我的已经可以了复制粘贴了),如果 ...

  9. java复习(8)---I/O

    本节复习java常用i/o,输入输出流. 先放上样例代码.方便参考,可以轻松看懂. package re08; import java.io.*; import java.util.Scanner; ...

  10. HYML / CSS和Javascript 部分

    1  CSS实现垂直水平居中 HTML结构: <div class="wrapper"> <div class="content">&l ...