go语言学习:go类型系统

本文是作者根据《Go语言实战》一书总结的学习笔记,主要介绍了Go语言的类型系统,包括自定义类型、方法、类型的本质(内置类型、引用类型、结构类型)、接口及其实现、嵌入类型和公开标识符的规则。强调了Go语言中不同类型在内存管理和方法调用上的特点,并解释了如何通过接口实现多态。
摘要由CSDN通过智能技术生成

go语言学习:go类型系统

此文章作者看书《go语言实战》总结而来,为作者自己备忘使用。如果能帮助到他人,是我的荣幸。也请各位看官觉得文章中那么不对能及时指出,共同进步。

go语言是静态语言,这意味着编译器需要在编译时知道变量的类型。类型提供给编译期的信息:

  • 内存规模:编译期得知该分配多少内存
  • 内存表示信息:内存中存放的是何物

1. 自定义类型

1.1. 用户可以使用struct自定义结构

/* 代码片段 5.1 */

// 声明一个用户类型 name
type name struct {
   
  firstname string
  lastname string
}

// 声明一个name变量。使用变量的默认值初始化。数值:0;字符串:"";布尔类型:false
var name1 name

// 使用 结构字面量 方式1 声明并初始化
name2 := name{
   
  firstname: "kris",
  lastname: "who", // 每一行末尾需要逗号。值顺序不重要
}
// 使用 结构字面量 方式2 声明并初始化
name3 := name {
   "kris", "wu"} // 值的顺序重要

// 定义嵌套结构
type person struct {
   
  _name name,
  _sex string
}

1.2. 基于已有基础类型声明新类型

/* 代码片段 5.2 */
type Duration int64 

Duration类型虽然使用int64类型表示,但编译器会将两者视为不同的类型。即使能相互兼容,但不能相互赋值。编译器不会对不同类型的值做隐式转化(这点和C++有点差异)。

2、方法

方法能给用户定义的类型添加新的行为。

/* 代码片段 5.3 */

// 以 代码片段 5.1 的name结构体为例
func (n name) getName() {
   
  fmt.Printf("first name:%s, last name:%s", n.firstname, n.lastname)
}

func (n *name) getLastName() {
   
  return n.lastname
}

上诉代码中func和函数名(getName)之间的参数被称为接收者,如果一个函数有接收者,那该函数就被称为方法

接收者分为:值接收者指针接收者。参数传递的规则和C++中的函数参数传递规则相同,即值接收者时,是通过值副本的方式传递;指针接收者时,通过传递指针的副本,但本质上指向的是同一块内存

无论你在定义方法时使用的是值接收者还是指针接收者,都可以通过变量或变量指针来调用。即

/* 代码片段 5.4 */
// 使用 代码片段 5.1 的name结构体为例
name2 := name{
   
  firstname: "kris",
  lastname
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值