Go基础知识点(十三) | 青训营笔记

64 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第15天.

go方法接收者类型:

结构体实例,有值类型和指针类型,那么方法的接收者是结构体,也有值类型和指针类型.区别就是接收者是否复制结构体副本,值类型复制,指针类型不复制.

import "fmt"

type People struct {
   name string
}

func main() {
   p1 := People{
      name: "tom",
   }
   p2 := &p1
   fmt.Printf("p1:%T\n", p1)
   fmt.Printf("p2:%T\n", p2)
   fmt.Println(p1)
   show1(p1)
   fmt.Println(p1)
   fmt.Println("--------------")
   show2(p2)
   fmt.Println(*p2)
}
func show1(per People) {
   per.name = "tom...."
}
func show2(per *People) {
   per.name = "tom...."
}
image.png

go接口:

接口像是一个公司里面的领导,他会定义一些通用规范,只设计规范,而不实现规范.

go语言接口,是一种新的类型定义,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这写方法,就是实现了这个接口.

语法格式和方法非常类似.

package main

import "fmt"

type usb interface {
   read()
   write()
}
type computer struct {
   name string
}

func (com computer) read() {
   fmt.Println(com.name)
   fmt.Println("read")
}
func (com computer) write() {
   fmt.Println(com.name)
   fmt.Println("write")
}

type mobile struct {
   model string
}

func (mol mobile) read() {
   fmt.Println(mol.model)
   fmt.Println("read....")
}

   func (mol mobile) write() {
      fmt.Println(mol.model)
      fmt.Println("write...")
   }
func main() {
   col := computer{
      name: "lianxiang",
   }
   col.read()
   col.write()
   fmt.Println("-----------")
   mob := mobile{
      model: "vivo",
   }
   mob.read()
   mob.write()
}
image.png

实现接口必须实现接口中的所有方法

如果不实现所有接口方法,意味着没有继承这个接口。

go接口值类型接收者和指针类型接收者:

package main

import "fmt"

type Pet interface {
   eat(string) string
}
type Dog struct {
   name string
}

func (dog Dog) eat(new_name string) string {
   dog.name = new_name
   fmt.Println("方法里的name:", dog)
   fmt.Println("吃什么....")
   return new_name

}
func main() {
   dog := Dog{
      name: "huahua",
   }
   s := dog.eat("火鸡面")
   fmt.Println(s)
   fmt.Println("dog叫什么name:", dog.name)
}
image.png

证明值类型接收者并不会改变它的值.

func (dog *Dog) eat(new_name string) string {
   dog.name = new_name
   fmt.Println("方法里的name:", dog)
   fmt.Println("吃什么....")
   return new_name

}
func main() {
   dog := Dog{
      name: "huahua",
   }
   d2 := &dog
   s := d2.eat("火鸡面")
   fmt.Println(s)
   fmt.Println("dog叫什么name:", d2.name)
}
image.png

指针传递就会改变它的内容了.