这是我参与「第五届青训营 」笔记创作活动的第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...."
}
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()
}
实现接口必须实现接口中的所有方法
如果不实现所有接口方法,意味着没有继承这个接口。
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)
}
证明值类型接收者并不会改变它的值.
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)
}
指针传递就会改变它的内容了.