入门示例

package main
import "fmt"
//定义老师结构体,将老师中的各个属性  统一放入结构体中管理:
type Teacher struct{//变量名字大写外界可以访问这个属性Name stringAge intSchool string
}
func main(){//创建老师结构体的实例、对象、变量:var t1 Teacher // var a intfmt.Println(t1) //在未赋值时默认值:{ 0 }t1.Name = "xxx"t1.Age = 45t1.School = "清华大学"fmt.Println(t1)fmt.Println(t1.Age + 10)
}

struct内存分析

结构体实例的创建方式

【1】方式1:直接创建:

【2】方式2:创建并赋值

【3】方式3:返回的是结构体指针:

【4】方式4:返回的是结构体指针:

结构体之间的转换

【1】结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类型)

package main
import "fmt"
type Student struct {Age int
}
type Person struct {Age int
}
func main(){var s Student = Student{10}var p Person = Person{10}s = Student(p)fmt.Println(s)fmt.Println(p)
}

【2】结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转

package main
import "fmt"
type Student struct {Age int
}
type Stu Student
func main(){var s1 Student = Student{19}var s2 Stu = Stu{19}s1 = Student(s2)fmt.Println(s1)fmt.Println(s2)
}

方法的引入

【1】方法是作用在指定的数据类型上、和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct
【2】方法的声明和调用格式:

声明:
type A struct {Num int
}
func (a A) test() {fmt.Println(a.Num)
}调用:
var a A
a.test()

(1)func (a A) test()相当于A结构体有一个方法叫test
(2)(a A)体现方法test和结构体A绑定关系

【3】代码层面:

注意:
(1)test方法中参数名字随意起
(2)结构体Person和test方法绑定,调用test方法必须靠指定的类型:Person
(3)如果其他类型变量调用test方法一定会报错。
(4)结构体对象传入test方法中,值传递,和函数参数传递一致。

方法的注意事项

(1)结构体类型是值类型,在方法调用中,遵守值类型的传递机制,是值拷贝传递方式

(2)如程序员希望在方法中,改变结构体变量的值,可以通过结构体指针的方式来处理

我们写程序的时候,可以直接简化:

底层编译器做了优化,底层会自动帮我们加上 & *

(3)Golang中的方法作用在指定的数据类型上的,和指定的数据类型绑定,因此自定义类型,都可以有方法,而不仅仅是struct,比如int , float32等都可以有方法

package main
import "fmt"
type integer int
func (i integer) print(){i = 30fmt.Println("i = ",i)
}
func (i *integer) change(){*i = 30fmt.Println("i = ",*i)
}
func main(){var i integer = 20i.print()i.change()fmt.Println(i)
}

(4)方法的访问范围控制的规则,和函数一样。方法名首字母小写,只能在本包访问,方法首字母大写,可以在本包和其它包访问。

(5)如果一个类型实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出

以后定义结构体的话,常定义String()作为输出结构体信息的方法,在fmt.Println会自动调用

package main
import "fmt"
type Student struct{Name stringAge int
}
func (s *Student) String() string{str := fmt.Sprintf("Name = %v , Age = %v",s.Name,s.Age)return str
}
func main(){stu := Student{Name : "丽丽",Age : 20,}//传入地址,如果绑定了String方法就会自动调用fmt.Println(&stu)
}

方法与函数的区别

【1】绑定指定类型:
方法:需要绑定指定数据类型
函数:不需要绑定数据类型

【2】调用方式不一样:
函数的调用方式:
函数名(实参列表)
方法的调用方式:变量.方法名(实参列表)

package main
import "fmt"
type Student struct{Name string
}
//定义方法:
func (s Student) test01(){fmt.Println(s.Name)
}
//定义函数:
func method01(s Student){fmt.Println(s.Name)
}
func main(){//调用函数:var s Student = Student{"丽丽"}method01(s)//方法调用:s.test01()
}

【3】对于函数来说,参数类型对应是什么就要传入什么。

package main
import "fmt"
type Student struct{Name string
}
//定义函数:
func method01(s Student){fmt.Println(s.Name)
}
func method02(s *Student){fmt.Println((*s).Name)
}
func main(){var s Student = Student{"丽丽"}method01(s)//method01(&s)错误method02(&s)//method02(s)错误
}

【4】对于方法来说,接收者为值类型,可以传入指针类型,接受者为指针类型,可以传入值类型。

package main
import "fmt"
type Student struct{Name string
}
//定义方法:
func (s Student) test01(){fmt.Println(s.Name)
}
func (s *Student) test02(){fmt.Println((*s).Name)
}
func main(){var s Student = Student{"丽丽"}s.test01()(&s).test01()//虽然用指针类型调用,但是传递还是按照值传递的形式(&s).test02()s.test02()//等价
}

go面向对象编程:结构体struct详解、结构体实例的创建方式、结构体之间的转换(type取别名的使用)、方法的注意事项及与函数的区别相关推荐

  1. (15)System Verilog结构体struct详解

    (15)System Verilog结构体struct详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog结构体struct详解 5) ...

  2. Scala进阶之路-面向对象编程之类的成员详解

    Scala进阶之路-面向对象编程之类的成员详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala中的object对象及apply方法 1>.scala 单例对象 ...

  3. C/C++结构体struct详解

    结构体定义 typedefstruct 用法详解和用法小结 typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便. 具体区别在于: 若struct node{}这样来 ...

  4. C语言结构体struct详解与实例

    目录 1.定义 2.应用 2.1初始化 2.2使用 3.结构体对齐规则与存储 1.定义 C语言中结构体(struct关键字定义)是一种自定义数据类型.通过结构体的定义可以将多种不同类型数据形成一个组合 ...

  5. C语言结构体struct详解

    目录 一.struct的概念 1.类比: 2.含义详解: 二.结构体变量的定义 1.创建结构体类型的时候定义 2.具体使用的时候定义 三.如何得到结构体成员? 1.通过 . 点操作符得到结构体成员 2 ...

  6. 面向对象编程(Python版详解)

    [辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...

  7. C 结构体 struct 详解

    数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为 ...

  8. MySQL目录结构以及配置文件详解

    昨天给大家进行了数据库介绍,今天将正式带领大家进入我们的课题MySQL讲解部分,首先给大家介绍一下MySQL安装后的目录结构和配置文件详解. 一.MySQL的目录结构 1.bin目录 用于放置一些可执 ...

  9. python编程入门与案例详解pdf-这些年我读过的技术经典图书(附电子版下载地址)...

    C技术资料 1.<> 作者: 谭浩强 这是我推荐的第一本书, 也是我接触的第一本书, 为什么把它放在第一位, 因为我觉得这本书对我的影响很大, 感觉这本书的最大特点是: 内容很全面, 内容 ...

最新文章

  1. ARM Cortex-M嵌入式C基础编程(上)
  2. 除了 AI,这些技术为 IIoT 插上飞向“4.0”的翅膀
  3. 蚂蚁金服CTO程立:AI尚不具备金融级的能力,开放是突破边界唯一出路
  4. [蓝桥杯][历届试题]蚂蚁感冒(模拟)
  5. 010-python基础-数据类型-字符串操作
  6. 自定函数获取datagrid,datalist,rpeater控件中header,footer栏中控件
  7. 《Cisco交换机配置与管理完全手册》(第二版)前言和目录
  8. 创意十足!25个服饰行业的网站设计作品
  9. mysql 现有的.sql_Mysql保持现有内容在后面增加内容的sql语句
  10. C#泛型委托Predicate、Action、Func
  11. 建造者模式Builder
  12. SpringBoot使用MongoDB异常问题
  13. 博客园复用别人的博客模板
  14. php算法求出一个数可以被分解成多少个_程序员的算法趣题
  15. 基于实现韦尔奇·鲍威尔法对图进行着色
  16. Serialize Your Deck with Positron [XML Serialization, XSD, C#]
  17. AI人工智能+大数据+ERP=?
  18. SDHC或SD2.0卡的驱动程序的注意事项
  19. php股票网站源代码,基于php的新三板实时股票信息接口调用代码实例
  20. 关于log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.li)的问题

热门文章

  1. html js更改title,如何使用js改变HTML中title里面固定的文字
  2. mysql反应慢_MySQL反应慢排查思路
  3. mysql 组复制和传统复制_MySQL的GTID复制与传统复制的相互切换
  4. Github开源!适合初学者的机器学习和深度学习的资料合集
  5. 【Python基础】入门Pandas不可不知的技巧
  6. 一般人不清楚--博士群体的择偶标准是什么?
  7. 年度布道师颁奖|盘点2020年网易智企的布道先锋们
  8. 移动社交如何玩?网易云信携手崽崽和Uki打造更多新场景!
  9. 0227互联网新闻 | 腾讯与英特尔联合推出云游戏平台“腾讯即玩”;华为企业业务MWC现场发布数字平台...
  10. 记录Nginx模块开发