GO结构体
go语言中是没有类的
但是go语言中可以使用结构体来定义类似与java类的结构
并借此来实现面向对象
结构体的定义
go语言中定义结构体是使用 type 和 struct
type person struct {
name string
age int
}
person 就是一个结构体 有着name和age两个属性
结构体的声明
var p = person{}
fmt.Printf(" type : %T",p)
//输出: type : main.person
结构体的赋值
//声明时赋值
var p = person{
name: "927",
age: 17,
}
fmt.Println("----------------------------------------------------------------------------")
//声明时赋值 按属性顺序赋值
var p = person{
"927",
17,
}
fmt.Println("----------------------------------------------------------------------------")
//声明后赋值
var p = person{}
p.name="927"
p.age=18
fmt.Println("----------------------------------------------------------------------------")
//构造函数赋值
p:= newPerson("927",17)
type person struct {
name string
age int
}
func newPerson(name string, age int) person{
return person{
name: name,
age: age,
}
结构体的属性 只要用相同字段类型接收好了
var p = person{
name: "927",
age: 17,
}
var age string
age = p.name
fmt.Println(age)
结构体定义方法
面向对象:人能做什么 吃饭 跑步等等
现在我给结构体定义一个方法
方法的定义 与函数结构差不多
函数: func 方法名(参数)(返回值){
}
方法 : func (结构体)方法名(参数)(返回值){
}
//给 person 定义一个方法 输出一句话
func (p person) eat(food string) {
fmt.Printf(" %s 在吃 %s ", p.name, food)
}
方法的使用
声明结构体 使用结构体 . 方法名
完整代码 ↓
package main
import "fmt"
//定义结构体 person
type person struct {
name string //定义name属性 string类型
age int
}
//构造函数 接收属性 返回person结构体
//构造函数一般以new结构体名 命名
func newPerson(name string, age int) person {
return person{
name: name,
age: age,
}
}
//声明persond的eat方法
func (p person) eat(food string) {
fmt.Printf(" %s 在吃 %s ", p.name, food)
}
func main() {
p := newPerson("927", 17)
p.eat("海苔")
//输出: 927 在吃 海苔
}
匿名结构体
在定义一些临时数据结构等场景下还可以使用匿名结构体
不常用 注意是分号
var v struct{ name string; age int}
v.name="927"
v.age=17
为什么要有指针类型结构体
go语言函数传参都是值拷贝
如果结构体数据过多 每次拷贝都会较多消耗资源 使用指针类型
结构体是值传递
package main
import "fmt"
func main() {
p:= newPerson("927",17)
fmt.Println(p.age)
p.addAge()
fmt.Println(p.age)
//输出
//17
//17
}
type person struct {
name string
age int
}
func newPerson(name string, age int) person {
return person{
name: name,
age: age,
}
}
func (p person) addAge() {
p.age++
}
指针结构体的使用
使用new函数创建
package main
import "fmt"
func main() {
p := new(person)
p.age=17
fmt.Printf("type: %T",p)
//type *main.person
}
type person struct {
name string
age int
}
通过构造函数创建指针
package main
import "fmt"
func main() {
p := newPerson("927", 17)
fmt.Printf("type: %T", p)
}
type person struct {
name string
age int
}
// 返回指针类型
func newPerson(name string, age int) *person {
return &person{
name: name,
age: age,
}
}
定义指针方法
package main
import "fmt"
func main() {
p := newPerson("927", 17)
p.addAge()
fmt.Println(p.age)
//输出 18
}
type person struct {
name string
age int
}
func newPerson(name string, age int) *person {
return &person{
name: name,
age: age,
}
}
func (p *person) addAge(){
p.age++
}