标签:内存布局 世界 delegate err 接口 消息 lock type 键值
Go语言通过自定义的方式形成新的类型
结构体是类型中带有成员的复合类型,使用结构体和结构体成员描述真实世界的实体和实体对应的各种属性
Go 语言中类型可以被实例化,使用new
或&
构造的类型实例的类型是类型的指针
结构体成员:一系列成员变量构成,成员变量也称“字段”
字段特性:
字段拥有自己的类型和值
字段名必须唯一
字段的类型也可以是结构体,甚至是字段所在结构体的类型
注意:
Go语言没有“类”的概念,也不支持“类”的继承等面向对象的概念
Go 语言结构体与“类“都是符合结构体,但是结构体的内嵌配合接口比面向对象具有更高的扩展性和灵活性
Go 语言不仅结构体能拥有方法,且每种自定义类型也可以拥有自己的方法
结构体定义只是一种内存布局的描述
使用关键字type
定义各种基本类型,整型、字符串、布尔等
结构体定义格式:
type 类型名 struct {
字段1 字段1类型
字段2 字段2类型
...
}
类型名:结构体名称标示名称,同一个包内不能重复
struct{}: 表示结构体类型
字段1、字段2: 结构体内字段名称必须唯一
例子:
type Point struct{
x int
y int
}
同类型变量可以同一行
type color struct{
R, G, B byte
}
只有当结构体实例化时,才会真实分配内存
结构体实例与实例之间的内存是完成独立的
实例化方式:
基本实例化方式 -- var ins T
创建指针类型的结构体 --new 关键字
取结构体的地址实例化 -- &
基本实例化格式:
var ins T
例子:
type point struct {
x int
y int
}
?
var p Point
p.x = 10
?
使用“.”访问结构体体成员如p.x
使用new 关键字进行实例化
基本格式:
ins := new(T)
T:类型,如结构体、整型、字符串等
ins:保存T类型被实例化的实例到该变量中国呢,如果T类型是*T,是属于指针类型
例子:
type Player struct {
Name string
HealthPoint int
MagicPoint int
}
?
tank := new(Player)
tank.Name = "Cannon"
tank.HealthPoint = 300
?
fmt.Println(tank)
执行结果:
&{Cannon 300 0}
可以看出tank 是new(Player)的实例, 那么我们直接通知&方式取址也是可以进行结构体的创建的
取址格式:
ins := &T{}
Ins : 结构体实例,类型是*T,是指针类型
package main
?
import (
"fmt"
)
// 3. 取址实例化
type Command struct {
Name string
Var *int
Comment string
}
?
// 取址实例化函数
func newCommand(name string, varref *int, comment string) *Command {
return &Command{
Name: name,
Var: varref,
Comment: comment,
}
}
?
func main() {
// 三种实例化方式
// 第一种: 声明变量方式
type Point struct {
x int
y int
}
var p Point
p.x = 10
p.y = 10
?
fmt.Println(p);
?
// 2. new关键字 实例化
type Player struct {
Name string
HealthPoint int
MagicPoint int
}
?
tank := new(Player)
tank.Name = "Cannon"
tank.HealthPoint = 300
?
fmt.Println(tank)
// 3. 取址实例化
var version int = 1
?
cmd := &Command{}
cmd.Name = "version"
cmd.Var = &version
cmd.Comment = "shwo version"
?
fmt.Println(cmd)
//&{version 0xc000090000 shwo version}
?
cmd2 := newCommand(
"version",