Go语言学习记录--结构体
Go语言中的结构体
Go语言中没有类这一概念,但是其中所包含的结构体可以实现继承的功能。
自定义类型
使用type关键字声明自定义类型的格式如下:
type new_type_name orign_type_name
type为关键字,new_type_name是自定义类型名,origin_type_name是GO某个自带的类型(eg,struct)
声明并实例化指针类型的结构体变量
在go语言中,使用new()函数可以对结构体变量进行实例化,并返回结构体变量的地址
除了使用new()函数,还使用&运算符直接对结构体进行取结构体地址操作
下面代码展示了声明结构体,以及结构体指针的用法;
package main import ( "fmt" ) func test1() { var name string name = "tom" var p *string p = &name fmt.Println("name:", name) fmt.Println("p:", p) fmt.Println("*P:", *p) } func test2() { type person struct { id int age int name string } tom := person{ id: 1, age: 13, name: "tom", } fmt.Println(tom) var p_struct *person p_struct = &tom fmt.Println("p_struct: ", &p_struct) fmt.Println("*p_struct: ", *p_struct) } func test3() { type customer struct { id int age int } var c = new(customer) c.id = 101 c.age = 12 fmt.Println(*c) } func main() { test1() test2() test3() }
运行结果:
构造函数与方法
在go语言中,构造函数是通过初始化结构体来模拟实现的。
package main import "fmt" import "reflect" type Cat struct { gender int color string name string } func newCat(gender int, color string, name string) *Cat { return &Cat{ gender: gender, color: color, name: name, } } func main() { CatOne := newCat(0, "white", "三酷猫") fmt.Println(CatOne) fmt.Println(reflect.TypeOf(CatOne)) }
运行结果:
方法与接收者
在Go语言中,也有方法的概念。它作用于结构体中特定字段的函数,这些字段变量被称为接收者。声明格式如下:
func (receiver_name receiver_type) function_name(params)(return_types){}
与函数的的区别:声明函数是无须给定接收者参数的。
废话不说,看代码:
package main import ( "fmt" "reflect" ) type NBAPLAYER struct { height int postion string name string } func newPlayer(height int, postion string, name string) *NBAPLAYER { return &NBAPLAYER{ height: height, postion: postion, name: name, } } func (nbaInstance NBAPLAYER) get_score(score int) { fmt.Println(nbaInstance.name, "今晚拿了", score, "分") } func (nbaInstance NBAPLAYER) train() { fmt.Println(nbaInstance.name, "正在训练") } func (nbaInstance NBAPLAYER) reName(newname string) { nbaInstance.name = newname fmt.Println("方法中nbaInstance的name属性值为:", nbaInstance.name) } func main() { nbaplayer := newPlayer(198, "控球后卫", "Kol Mikkelson") fmt.Println(nbaplayer) fmt.Println(reflect.TypeOf(nbaplayer)) nbaplayer.get_score(55) nbaplayer.train() nbaplayer.reName("KOl") nbaplayer.train() }
运行结果: