go语言第六天 | 青训营笔记

60 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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)
}

image.png

看得出来 只有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"