定义

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的更多相关文章

  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. 老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

    老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件   从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...

  2. (删)Java线程同步实现一:synchronzied和wait()/notify()

    上面文章(2.Java多线程总结系列:Java的线程控制实现)讲到了如何对线程进行控制,其中有一个是线程同步问题.下面我们先来看一个例子: 1.一个典型的Java线程安全例子 package com. ...

  3. WebApp框架

    我所知道的webapp开发框架,欢迎补充, Framework7包含ios和material两种主题风格并且有vue版和react版, vue发现一个vue-material, react有一款mat ...

  4. 搞定:Enter passphrase for key提示

    使用ssh-genkey生成公用key,但是自己使用时会多次提示,Enter passphrase for key,这儿给出如何解决. 在${HOME}/.bashrc中增加如下代码: alias a ...

  5. Redis基础学习(二)—数据类型

    一.Redis支持的数据类型 Redis中存储数据是通过key-value存储的,对于value的类型有以下几种: (1)字符串. (2)Map (3)List (4)Set   public cla ...

  6. C#设计模式:责任链模式

    设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...

  7. var的一些理解

    var 是 variable(变量,可变物)的简写.在多种编程语言中,var 被用作定义变量的关键字,在一些操作系统中也能见到它的身影.类似object,但是效率比object高一点. var是一个局 ...

  8. 极化SAR图像基础知识(1)

    从今天开始学习极化SAR图像,记录于此. 极化散射矩阵S是用来表示单个像素散射特性的一种简便办法,它包含了目标的全部极化信息.

  9. 跟着刚哥梳理java知识点——集合(十二)

    Java集合分为Collection和Map两种体系 一.Collection接口: Collections接口为我们提供了以下方法: size():返回集合中元素的个数 add(Object obj ...

  10. 学习Sass笔记之概念篇

    1 什么是CSS预处理器 首先我们了解一下什么是CSS预处理器:通俗的说,“CSS 预处理器用一种专门的编程语言,进行 Web 页面样式设计,然后再编译成正常的 CSS 文件,以供项目使用.CSS 预 ...