php struct类型,go - struct类型

struct类型

1. 概述

与C语言struct一样,与java/php等class类似,在Go中,用于扩展类型,面向对象编程(本部分暂未做详细介绍)等

声明格式:(是类型的组合)

type typeName struct {

//...

}

2. 声明及初始化

方法有几种:

var varName typeName //①

varName := new(typeName) //②

varName := typeName{[初始化值]} //③

varName := &typeName{[初始化值]} //④  注: ①③返回 typeName 类型变量;②④返回 *typeName 类型变量;③④[]可省略;若无初始化值,则默认为零值

初始化值可以分为两种:

a. 有序: typeName{value1, value2, ...} 必须一一对应

b. 无序: typeName{field1:value1, field2:value2, ...} 可初始化部分值

例:

type Person struct {

name string

age int

}

p := Person{"James", 23} //有序

p := Person{age:23} //无序3. 操作

声明的struct与普通类型一样

访问结构体中的一个变量名, 用 "." 来连接:

varName.field

如操作上面 Person 结构体中的 age : p.age = 35

也可以作为函数中的参数,返回值类型

如:

func funcName(varName1 typeName2[,varName2 typeName2, ...]) typeName {...}

example code list

package main

import "fmt"

//1. 声明一个自定义类型名为 Person 的结构体

type Person struct {

name string

age int

}

func main() {

//2. 初始化

var p1 Person

p2 := Person{}

p3 := Person{"James", 23}

p4 := Person{age:23}

fmt.Println(p1, p2, p3, p4)

p5 := new(Person)

p6 := &Person{}

p7 := &Person{"James", 23}

p8 := &Person{age:23}

fmt.Println(p5, p6, p7, p8)

/*********************************/

/*print result */

/*{ 0} { 0} {James 23} { 23} */

/*&{ 0} &{ 0} &{James 23} &{ 23} */

/*********************************/

//3. 操作

p1.age = 50

p2.age = 25

if compareAge(p1, p2) {

fmt.Println("p1 is older than p2")

} else {

fmt.Println("p2 is older than p1")

}

/*********************************/

/*print result */

/*p1 is older than p2 */

/*********************************/

}

func compareAge(p1, p2 Person) bool {

if p1.age > p2.age {

return true

}

return false

}

4. 匿名字段

声明一个 struct1 可以包含已经存在的 struct2 或者go语言中内置类型作为内置字段,称为匿名字段,即只写了 typeName,无 varName,但是 typeName 不能重复

匿名字段与面向对象程序语言中的继承

4.1 声明及初始化:

如:

type Person struct {

name string

age int

addr string

}

type Employee struct {

Person //匿名字段

salary int

int //用内置类型作为匿名字段

addr string //类似于重载

}

em1 := Employee{Person{"rain", 23, "qingyangqu"}, 5000, 100, "gaoxingqu"}  4.2 操作

访问方式也是通过 "." 来连接

相同字段采用最外层优先访问,类似于重载

em1.addr 访问的是 Employee 中最外层的 addr

em1.Person.addr 访问的是 Employee 中 Person 中的 addr

example code list

package main

import "fmt"

type Person struct {

name string

age int

addr string

}

type Employee struct {

Person //匿名字段

salary int

int //用内置类型作为匿名字段

addr string //类似于重载

}

func main() {

/*

var em1 Employee = Employee{}

em1.Person = Person{"rain", 23, "qingyangqu"}

em1.salary = 5000

em1.int = 100 //使用时注意其意义,此处无

em1.addr = "gaoxingqu"

*/

//em1 := Employee{Person{"rain", 23, "qingyangqu"}, 5000, 100, "gaoxingqu"}

//初始化方式不一样,但是结果一样

em1 := Employee{Person:Person{"rain", 23, "qingyangqu"}, salary:5000, int:100, addr:"gaoxingqu"}

fmt.Println(em1)

/******************************************************/

/*print result */

/*{{rain 23 qingyangqu} 5000 100 gaoxingqu} */

/******************************************************/

fmt.Println("live addr(em1.addr) = ", em1.addr)

fmt.Println("work addr(em1.Person.addr) = ", em1.Person.addr)

em1.int = 200 //修改匿名字段的值

/******************************************************/

/*print result */

/*live addr(em1.addr) = gaoxingqu */

/*work addr(em1.Person.addr) = qingyangqu */

/******************************************************/

}

还有很多关于struct面向对象的知识,后面再学习

有疑问加站长微信联系(非本文作者)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值