9.10Go之结构体之实例化
什么是结构体
概念:
-
一种内存布局的描述
-
结构体本身是一种复合类型--->可以看成是变量的意思
使用结构体的特点
-
当结构体实例化时,才会真正的分配内存
-
只有当定义的结构体实例化以后才能使用结构体的字段
什么是结构体实例化
概念:
-
结构体实例化就是根据结构体定义的格式创建一份与格式一致的内存区域
特点:
-
结构体实例与实例之间的内存是完全独立的
Go语言中几种实例化结构体的方法
基本的实例化形式
创建指针类型的结构体
取结构体的地址实例化
基本的实例化形式
概念:
-
结构体本身是一种类型,可以像整型、字符串等类型一样,以 var 的方式声明结构体即可完成实例化
实例化格式:
var ins T
/*
T 为结构体类型,ins 为结构体的实例
*/
示例代码:
需求:
-
定义一个point结构体
-
里面有三个成员x,y,z
-
把它们实例化出来
package main
/*
定义一个point结构体
*/
type point struct {
X float64
Y float64
Z float64
}
func main() {
//利用变量的形式把point结构体实例化出来
var p point
p.X = 3.14
p.Y = 6.28
p.Z = 9.72
}
/*
使用.来访问结构体的成员变量
*/
创建指针类型的结构体
概念:
-
像
Java
中创建对象一样,Go语言可以用关键字new
对类型(包括结构体、整型、字符串等)进行实例化。结构体在实例化后会形成指针类型的结构体
实例化格式:
ins := new(T)
/*
ins的类型是指针类型
*/
-
T 为类型,可以是结构体、整型、字符串等。
-
ins:T 类型被实例化后保存到 ins 变量中,ins 的类型为 *T,属于指针。
示例代码:
需求:
-
定义一个player结构体
-
有名字、生命值、魔法值
-
使用
new
关键字对结构体进行实例化 -
对成员进行赋值
package main
/*
创建一个player结构体
*/
type player struct {
Name string
HP float64
MP float64
}
func main() {
//使用new关键字对结构体进行实例化
playerNo1 := new(player)
playerNo1.Name = "JunkingBoy"
playerNo1.HP = 100000000
playerNo1.MP = 100000000
}
在 C/C++ 语言中,使用 new 实例化类型后,访问其成员变量时必须使用->
操作符
取结构体的地址实例化
概念:
-
Go语言中认为对结构体进行
&
取地址操作是对结构体进行一次实例化操作
实例化格式:
ins := &T{}
/*
ins是一个变量
*/
-
T 表示结构体类型。
-
ins 为结构体的实例,类型为 *T,是指针类型。
代码示例:
需求:
-
定义一个命令行结构体
-
里面包含名称、绑定的变量、注释三个成员
-
使用取地址对结构体进行实例化
-
封装起这个过程
package main
/*
创建一个命令行结构体
*/
type Command struct {
Name string //指令名称
Var *int //指令绑定的变量
/*
命令绑定的变量,使用整型指针绑定一个指针,指令的值可以与绑定的值随时保持同步
*/
Comment string //注释
}
//定义指令绑定的变量
var version int = 1
/*
命令绑定的目标整型变量:版本号
*/
func main() {
//使用取地址对结构体进行实例化
cmd := &Command{}
cmd.Name = "version"
cmd.Var = &version
cmd.Comment = "show version"
}
使用函数封装上诉过程:
/*
使用函数封装实例化结构体、对成员进行赋值、绑定等操作
调用这个函数自动的对结构体进行赋值操作并且返回传入的参数
*/
func newCommand(name string, varref *int, comment string) *Command {
return &Command{
Name: name,
Var: varref,
Comment: comment,
}
}
取地址实例化是最广泛的一种结构体实例化方式