go语言结构体中的方法是值接收,实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量

若结构体中的方法是值接收,实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量

值接收者:如果结构体中的方法是值接收者,
那么实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量

package main

import "fmt"

type Usber interface {
	start()
	stop()
}

type Phone struct {
	Name string
}

func (p Phone) start() { // 结构体的接收者是值类型的
	fmt.Printf("start phone\n")
}
func (p Phone) stop() {
	fmt.Printf("stop phone\n")
}

func main() {
	// 结构体的接收者如果是值类型的,实例化后的结构体值类型和体指针类型都可以赋值给接口变量
	// 实例化后的结构体值类型
	var p = Phone{"小米14"}
	var p1 Usber = p // 表示让Phone实现Usber接口
	p1.start()
	p1.stop()

	//  结构体的接收者如果是值类型的,实例化后的结构体值类型和体指针类型都可以赋值给接口变量
	var p3 = &Phone{"小米14"}
	p3.start()
	p3.stop()
}

结构体中的方法是指针类型接收者,实例化后的结构体只能是指针类型才能赋值给接口变量

指针类型接收者:如果结构体中的方法是指针类型接收者,
那么实例化后的结构体只能是指针类型才能赋值给接口变量,值类型不能赋值给接口变量会报错

package main

import "fmt"

type Usber interface {
	start()
	stop()
}

type Phone struct {
	Name string
}

func (p *Phone) start() { // 结构体的接收者是指针类型的
	fmt.Printf("start phone\n")
}
func (p *Phone) stop() { // 结构体的接收者是指针类型的
	fmt.Printf("stop phone\n")
}

func main() {
	//  因为结构体的接收者是指针类型的,所以实例化后的结构体只能是指针类型才能赋值给接口变量
	var p3 = &Phone{"小米14"}
	p3.start()
	p3.stop()
}

结构体中的方法是指针类型接收者,实例化后的结构体如果是值类型,会报错

package main

import "fmt"

type Usber interface {
	start()
	stop()
}

type Phone struct {
	Name string
}

func (p *Phone) start() { // 结构体的接收者是指针类型的
	fmt.Printf("start phone\n")
}
func (p *Phone) stop() { // 结构体的接收者是指针类型的
	fmt.Printf("stop phone\n")
}

func main() {
	// 结构体的接收者如果是值类型的,实例化后的结构体值类型和体指针类型都可以赋值给接口变量
	// 实例化后的结构体值类型
	var p = Phone{"小米14"}
	var p1 Usber = p // 表示让Phone实现Usber接口
	p1.start()
	p1.stop()
}

会报错的哈
\tempCodeRunnerFile.go:25:17: cannot use p (variable of struct type Phone) as Usber value in variable declaration: Phone does not implement Usber (method start has pointer receiver)

posted @ 2026-10-04 20:37  何人陪我共长生  阅读(9)  评论(0)    收藏  举报