GO入门——6. struct与方法
1 struct
- Go 中的struct与C中的struct非常相似,并且Go没有class
- 使用 type struct{} 定义结构,名称遵循可见性规则
- 支持指向自身的指针类型成员
- 支持匿名结构,可用作成员或定义成员变量
- 匿名结构也可以用于map的值
- 可以使用字面值对结构进行初始化
- 允许直接通过指针来读写结构成员
- 相同类型的成员可进行直接拷贝赋值
- 支持 == 与 !=比较运算符,但不支持 > 或 <
- 支持匿名字段,本质上是定义了以某个类型名为名称的字段
- 嵌入结构作为匿名字段看起来像继承,但不是继承
- 可以使用匿名字段指针
//声明结构类型
type Person struct {
	Name string
	Age  int
}
//包含匿名结构并作为内部成员变量
type FullPerson struct {
	Name    string
	Age     int
	Contact struct {
		Phone, City string
	}
}
//匿名字段名结构
type NoFiledName struct {
	string
	int
}
//嵌入结构
type in struct {
	A string
}
type out struct {
	in
	Name string
}
func funcStruct() {
	//初始化时可以使用p :=&Person{},实现初始化和获取指针
	//一般采用&Person{}这样做赋值
	per := Person{}
	fmt.Println(per) //{ 0},string默认空字符串,int默认0
	per.Age = 25 //通过.对字段操作
	//无构造函数,初始化可指定字段值
	//Person{"ppjj", 22},可以不写字段名那就必须全部按顺序赋值
	per = Person{
		Name: "pj",
		Age:  24, //结尾都需要逗号
	}
	fmt.Println(per) //{pj 24}
	//struct的函数传入是值传递
	A := func(p Person) {
		p.Age = 10
		fmt.Println(p) //{pj 10}
	}
	A(per)
	fmt.Println(per) //{pj 24},函数中执行的结果并不会修改per
	//使用指针实现对struct的引用传递
	B := func(p *Person) {
		p.Age = 20     //指针struct可以用.直接操作
		fmt.Println(p) //&{pj 20}
	}
	B(&per)
	fmt.Println(per) //{pj 20},函数中传入的是地址,因此此处值也修改了
	//匿名结构
	a := &struct {
		Name string
		Age  int
	}{
		Name: "pj",
		Age:  25,
	}
	fmt.Println(a) //&{pj 25}
	//包含匿名结构的成员变量
	fp := &FullPerson{}
	fmt.Println(fp) //&{ 0 { }}
	fp = &FullPerson{Name: "pj", Age: 25}
	fp.Contact.Phone = "187" //匿名结构成员变量只能通过这种方式进行初始化
	fp.Contact.City = "zz"
	fmt.Println(fp) //&{pj 25 {187 zz}}
	////匿名字段名结构,初始化时必须按定义的顺序
	nfn := &NoFiledName{"pj", 12}
	fmt.Println(nfn) //&{pj 12}
	//嵌入结构
	o := &out{Name: "pj", in: in{A: "in"}}
	fmt.Println(o) //&{{in} pj}
	o.Name = "ppjj"
	o.A = "in1"
	fmt.Println(o) //&{{in1} ppjj}
	o.in.A = "in2"
	//两种访问方式,如果两个结构有重名字段则被加入的将被隐藏,只能通过o.in.A这样访问
	fmt.Println(o) //&{{in2} ppjj}
}
2 方法
- Go 中虽没有class,但依旧有method
- 通过显示说明receiver来实现与某个类型的组合
- 只能为同一个包中的类型定义方法
- Receiver 可以是类型的值或者指针
- 不存在方法重载
- 可以使用值或指针来调用方法,编译器会自动完成转换
- 从某种意义上来说,方法是函数的语法糖,因为receiver其实就是
 方法所接收的第1个参数(Method Value vs. Method Expression)
- 如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
- 类型别名不会拥有底层类型所附带的方法
- 方法可以调用结构中的非公开字段
type AA struct {
	Name string
}
type BB struct {
	Name string
}
//接收者为AA,值传递
func (a AA) Print(name string) {
	a.Name = "ppjj"
	fmt.Println(a.Name + name)
}
//接收者为BB,引用传递
func (a *BB) Print(name string) {
	a.Name = "ppjj"
	fmt.Println(a.Name + name)
}
func funcMethod() {
	//值传递,不能修改字段
	a := AA{Name: "pj"}
	a.Print("test")
	fmt.Println(a)
	//引用传递,可以修改字段
	b := BB{Name: "pj"}
	b.Print("test")
	fmt.Println(b)
}
GO入门——6. struct与方法的更多相关文章
- Go 语言入门(二)方法和接口
		写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于A tour of Go编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(二 ... 
- 30分钟入门Java8之默认方法和静态接口方法
		30分钟入门Java8之默认方法和静态接口方法 前言 上一篇文章30分钟入门Java8之lambda表达式,我们学习了lambda表达式.现在继续Java8新语言特性的学习,今天,我们要学习的是默认方 ... 
- Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)
		本篇分三部分: 一.Struct Mutable方法 二.多元组(Tuple) 的使用 三.autoclosure 的使用 四.Optional Chain 的使用 一.Struct Mutable方 ... 
- golang 入门之struct继承,嵌套
		package main import "fmt" type Jocongmin struct{ Name string Home string Want string } fun ... 
- go chapter 10  函数  方法  struct的方法
		1. struct的方法 // 定义struct type MyStruct struct{} // 定义方法 (那个对象可以回调)方法名(参数) 返回值 {} (s *MyStruct) FillS ... 
- Python 入门 之 双下方法
		Python 入门 之 双下方法 1.双下方法  定义:双下方法是特殊方法,它是解释器提供的 由双下划线加方法名加双下划线 方法名的具有特殊意义的方法,双下方法主要是python源码程序员使用的,我 ... 
- matlab中struct创建方法
		MATLAB中struct创建方法可分为:直接创建法和struct()函数创建法 (1)直接创建: 直接定义字段,像使用一般matlab变量一样,不需要事先声明,支持动态扩充.下面创建一个Studen ... 
- golang 对struct进行Serialize的方法,即将存取二进制文件到struct的方法
		方法一: serialize 的标准方法: 使用gob 和 base64 或 base58. 方法二: 下面是自己实现的 serialize 方法,不推荐自己实现,应该用标准方法. 代码如下: pac ... 
- go struct 的方法1
		方法 Go 没有类.然而,仍然可以在结构体类型上定义方法. 方法接收者 出现在 func 关键字和方法名之间的参数中. package main import ( "fmt" ... 
随机推荐
- [leetcode]341. Flatten Nested List Iterator展开嵌套列表的迭代器
			Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ... 
- [leetcode]94. Binary Tree Inorder Traversal二叉树中序遍历
			Given a binary tree, return the inorder traversal of its nodes' values. Example: Input: [1,null,2,3] ... 
- 17. pt-online-schema-change
			在平时MySQL的运维过程中,经常会遇到表结构的变更.在表比较小的时候,直接进行变更,时间较短,但是当表非常大的时候,这么做会导致应用卡死,服务不可用.目前InnoDB引擎是通过以下步骤来进行DDL的 ... 
- 多线程安全单例模式学习代码 c++11
			// Singleton.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <mutex> #include & ... 
- 使用RabbitMq
			1.配置环境 http://www.cnblogs.com/longlongogo/p/6479424.html 2.安装RabbitMQ https://www.cnblogs.com/longlo ... 
- C# 多线程编程,传参,接受返回值
			C# 多线程编程,传参,接受返回值 今天将多线程的知识有回顾了下,总结了几点: 新建一个线程(无参数,无返回值) Thread th = new Thread(new ThreadStart(Prin ... 
- addEventListener()方法
			★JS事件的捕获阶段和冒泡阶段: 讨论的主要是两个事件模型:IE事件模型与DOM事件模型 IE内核浏览器的事件模型是冒泡型事件(没有捕获事件过程),事件句柄的触发顺序是从ChildNode到Paren ... 
- MFC的停靠窗口中插入对话框,在对话框中添加控件并做控件自适应
			单文档程序添加了停靠窗口后,可能会在停靠窗口中添加一些控件.在这里我的做法是在对话框上添加控件并布局,然后将这个对话框插入到停靠窗口中. 步骤 1.插入对话框,在对话框中放入控件(我的为树形控件),并 ... 
- zabbix  items
			zabbixversion:3.2.8 在添加zabbix items的时候,注意store value的设置非常实用,有三种选择: As is:d对接受到的结果不做任何处理 Delta(speed ... 
- pycharm中新建external tools
			1.Settings-Tools-External Tools 点击+号 2.Tools settings中的设置如下: Program: $PyInterpreterDirectory$/pytho ... 
