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

  1. Go 语言入门(二)方法和接口

    写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于A tour of Go编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(二 ...

  2. 30分钟入门Java8之默认方法和静态接口方法

    30分钟入门Java8之默认方法和静态接口方法 前言 上一篇文章30分钟入门Java8之lambda表达式,我们学习了lambda表达式.现在继续Java8新语言特性的学习,今天,我们要学习的是默认方 ...

  3. Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)

    本篇分三部分: 一.Struct Mutable方法 二.多元组(Tuple) 的使用 三.autoclosure 的使用 四.Optional Chain 的使用 一.Struct Mutable方 ...

  4. golang 入门之struct继承,嵌套

    package main import "fmt" type Jocongmin struct{ Name string Home string Want string } fun ...

  5. go chapter 10 函数 方法 struct的方法

    1. struct的方法 // 定义struct type MyStruct struct{} // 定义方法 (那个对象可以回调)方法名(参数) 返回值 {} (s *MyStruct) FillS ...

  6. Python 入门 之 双下方法

    Python 入门 之 双下方法 1.双下方法 ​ 定义:双下方法是特殊方法,它是解释器提供的 由双下划线加方法名加双下划线 方法名的具有特殊意义的方法,双下方法主要是python源码程序员使用的,我 ...

  7. matlab中struct创建方法

    MATLAB中struct创建方法可分为:直接创建法和struct()函数创建法 (1)直接创建: 直接定义字段,像使用一般matlab变量一样,不需要事先声明,支持动态扩充.下面创建一个Studen ...

  8. golang 对struct进行Serialize的方法,即将存取二进制文件到struct的方法

    方法一: serialize 的标准方法: 使用gob 和 base64 或 base58. 方法二: 下面是自己实现的 serialize 方法,不推荐自己实现,应该用标准方法. 代码如下: pac ...

  9. go struct 的方法1

    方法 Go 没有类.然而,仍然可以在结构体类型上定义方法. 方法接收者 出现在 func 关键字和方法名之间的参数中. package main import (     "fmt" ...

随机推荐

  1. 2018-2019-2 20175234 实验一 Java开发环境的熟悉(Linux + IDEA)

    目录 20175234 实验一 Java开发环境的熟悉(Linux + IDEA) 第一部分 代码及运行结果截图 第二部分 要求 代码及截图 第三部分 题目 需求分析 设计 程序及运行结果 问题和解决 ...

  2. css3回顾 checkbox

    <div class="checkBox"> <input type="checkbox" id="check1"> ...

  3. 三、putty工具常见设置

    转载自:https://www.cnblogs.com/hdk1993/p/4769072.html Putty是一个免费小巧的Win32平台下的telnet,rlogin和ssh客户端. 它的主程序 ...

  4. 线程的使用方法start run sleep join

    今天回顾了Java的线程的一些知识 例1:下面代码存有详细的解释 主要是继承Thread类与实现Runnable接口 以及start()和run()方法 package com.date0607; / ...

  5. Linux驱动之poll机制的理解与简单使用

    之前在Linux驱动之按键驱动编写(中断方式)中编写的驱动程序,如果没有按键按下.read函数是永远没有返回值的,现在想要做到即使没有按键按下,在一定时间之后也会有返回值.要做到这种功能,可以使用po ...

  6. 设置angular公共样式表

    一.现象 新创建的项目,是直接显示在src目录下的,假如会用到其它第三方的全局样式时,不能统一放在一个地方统一来管理,就会感觉有点乱. 二.解决 1.移动样式表. 在assets文件夹(该文件夹一般都 ...

  7. centos7切换图像界面和dos界面

    在图形界面使用 ctrl+alt+F2切换到dos界面 dos界面 ctrl+alt+F2切换回图形界面 在命令上 输入 init 3 命令 切换到dos界面 输入 init 5命令 切换到图形界面 ...

  8. 分布式协议学习笔记(三) Raft 选举自编写代码练习

    由于时间安排上的原因,这次的代码写的稍微有些简略,只能算是自己对RAFT协议的一个巩固. 实现定义2个节点,使用读取配置文件来获取IP和端口以及节点ID 网络使用boost同步流程 一个线程收 一个线 ...

  9. 2018-10-19,下午4点拿到京东offer

    今天12点没有问题就签.岗位,地点都很满足.京东居然对我这么好,保证以后不做损坏京东利益的事写给以后的自己.

  10. 2019.02.21 bzoj2300: [HAOI2011]防线修建(set+凸包)

    传送门 题意:动态维护凸包周长. 思路: 见这篇求面积的吧反正都是一个套路. 代码: #include<bits/stdc++.h> #define int long long #defi ...