这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天 今天主要学习了go语言的结构体,方法和接口
结构体的定义和初始化需要用到type来定义一个struct结构体如下
注意定义的结构体名首字母要大写 否则在不同的包中就无法引用
type Person struct{
name string
age int
mar bool
}
这样就可以定义一个结构体类型 person
如果需要赋值可以
var p1=Person{
name:"tom",
age:66,
mar:true,
}
也可以挨个赋值,还有匿名结构体,只能用在一个函数内
匿名结构体:
var p2 struct{
name string
age int
mar bool
}
接下来讲讲结构体的嵌套
type Person struct{
name string
age int
mar bool
}
type Dog struct{
name string
age int
}
type Cus struct{
dog Dog
p1 Person
}
cus结构体内嵌套有dog和person两个结构体
func main() {
po := Person{
"tom",
18,
true,
}
dog1 := Dog{
"rua",
6,
}
cus := Cus{
dog: dog1,
p1: po,
}
}
如果想调用cus中的dog中的name,那么调用方法就是cus.dog.name,如果调用person中的mar,那么调用方法就是 cus.person.mar。以此类推
再来讲讲结构体的指针,如果我们想要用某个函数来改变结构体内部的值,那么就需要使用结构体指针,我们可以通过new()命令来开辟一个存储空间,我们可以p:=new(person)开辟一个person大小的存储空间将其地址赋值给p,然后我们就可以通过传入p参数来修改p地址所指向存储空间的值,
func f1(a person) {
a = person{
name: "wangg",
emal: "123.com",
age: 100, id: 96,
mar: true,
}
/* fmt.Printf("a: %v\n", a) */
}
func f2(b *person) {
(*b) = person{
name: "wangg",
emal: "123.com",
age: 100, id: 96,
mar: true,
}
/* fmt.Printf("(*b): %v\n", (*b)) */
}
func main(){
p := new(person)
f1(*p)
fmt.Printf("p: %v\n", p)
f2(p)
fmt.Printf("p: %v\n", p)
}
看得出来 只有f2改变了结构体的值
讲到结构体就不得不提到方法,其构造方法和函数很类似只是在函数名前加个括号,里面写上要关联的结构体就行
func(ptr person)eat(){
fmt.Printf("%v eating..."ptr.name)
}
调用时:
fun main(){
var p1 = person{
"xiaoz",
"1512.com",
18,
66,
true,
}
p1.eat()
}
在我看来 方法和函数非常相似,只是关联了某个结构体罢了,关联结构体无法改变其值,你也可以关联一个结构体指针,这样就可以进行对结构体内容的更改
func (cus *customer) loger() bool {
fmt.Scan(&cus.name)
fmt.Scan(&cus.pwd)
if cus.name == "root" && cus.pwd == 198 {
return true
} else {
return false
}
}
func main(){
k := new(customer)
k = &customer{
name: "lal",
pwd: 123445,
}
k.loger()
}
在k.loger之后,k中信息被修改成name:"root",pwd:"198"