Go函数,方法,接口

函数

package main

import "fmt"

// 具名函数
func Add(a, b int) int {
	return a + b
}

// 匿名函数
var Add2 = func(a, b int) int {
	return a + b
}

//多输入参数,多返回值
var Add3 = func(a int, more ...int) (int, int) {
var sum = 0;
for _, v := range more {
	sum += v;
}

return a, sum;
}

func main() {

fmt.Println(Add(1, 3))

fmt.Println(Add2(1, 3))

a, b := Add3(1, 2, 3, 4)
fmt.Println(a, b)

//闭包函数
for i := 0; i < 3; i++ {
	defer func() { println(i) }()
}

for i := 0; i < 2; i++ {
	j := i
	defer func() { println(j) }()
}
}

方法

package main

import "fmt"

type personmgs struct {
	name string
	age  int
	like []int
}

func (person personmgs) DisplayPerson() {
	fmt.Println(person.age, person.name, person.like)
}

func (person *personmgs) AddAge(number int) {
	person.age += number
}

type woman struct {
	personmgs
	sex string
}

func main() {
	var wp personmgs
	wp.name = "www"
	wp.age = 99
	wp.like = append(wp.like, []int{1, 2, 3}...)

	fmt.Println(wp);
	wp.DisplayPerson()

	wp.AddAge(1)
	wp.DisplayPerson()

	var nv woman
	nv.age = 77
	nv.sex = "女"
	fmt.Println(nv)
}

接口

package main

import (
	"fmt"
)

type Area interface {
	GetArea() float32
}

type Rect struct {
	x float32
	y float32
	w float32
	h float32
}

func (rect Rect) GetArea() float32 {
	return rect.h * rect.w
}

type Cricle struct {
	x float32
	y float32
	w float32
}

func (cricle Cricle) GetArea() float32 {
	return cricle.w * cricle.w * 3.14
}

/// 类似纯虚函数
type LING struct {
	Area
	x float32
	y float32
}

func (lin LING) GetArea() float32 {
	return lin.x * lin.y
}

//具有0个方法的接口称为空接口。它表示为interface {}。由于空接口有0个方法,所有类型都实现了空接口
func findType(i interface{}) {
	switch i.(type) {
	case string:
		fmt.Printf("String: %s\n", i.(string))
	case int:
		fmt.Printf("Int: %d\n", i.(int))
	default:
		fmt.Printf("Unknown type\n")
	}
}

func main() {

	var rect = Rect{1, 2, 3, 4}
	fmt.Println(rect)

	var cricle = Cricle{1, 2, 3}
	fmt.Println(cricle)

	var area Area = rect
	fmt.Printf("%v \n", area.GetArea())
	fmt.Printf("Type = %T, value = %v\n", area, area) //Type = main.Rect, value = {1 2 3 4}

	area = cricle
	fmt.Printf("%v \n", area.GetArea())
	fmt.Printf("Type = %T, value = %v\n", area, area) //Type = main.Cricle, value = {1 2 3}

	var lin LING
	lin.x = 1
	lin.y = 9
	area = lin
	fmt.Println(lin.GetArea(), area.GetArea())
	fmt.Printf("Type = %T, value = %v\n", area, area) //Type = main.LING, value = {<nil> 1 9}

	findType("www")
	findType(666)
}
### Golang 中通过函数实现接口Go 语言中,函数本身也可以作为值传递,并且可以通过适配器模式让函数满足某个接口的要求。具体来说,如果一个接口定义了一些方法签名,而这些方法可以用匿名结构体或者闭包来实现,则可以通过这种方式使函数间接实现接口。 下面是一个详细的解释以及代码示例: #### 使用匿名结构体包裹函数实现接口 当需要让一个普通的函数实现某个接口时,通常会创建一个匿名结构体并将该函数绑定到这个结构体的一个方法上。这样就可以利用此匿名结构体实例化并调用接口所要求的方法。 ```go package main import ( "fmt" ) // 定义一个简单的接口 type Greeter interface { Greet(name string) string } func greetFunc(name string) string { return "Hello, " + name } func main() { // 创建一个匿名结构体,它实现了Greeter接口 var g Greeter = &struct{ // 匿名结构体实现接口 f func(string) string }{ f: greetFunc, } // 实现Greet方法 g.(*struct{ f func(string) string }).Greet = func(name string) string { return g.f(name) } fmt.Println(g.Greet("Alice")) // 调用接口方法 } ``` 在这个例子中,`greetFunc` 是一个普通函数,但它被封装到了一个匿名结构体内,从而能够符合 `Greeter` 接口的定义[^1]。 --- #### 利用闭包直接实现接口 另一种方式是使用闭包技术,在运行时动态生成一个对象用于匹配目标接口。这种方法更简洁高效,尤其适用于简单场景下的快速开发需求。 ```go package main import "fmt" // 定义Speaker接口 type Speaker interface { Speak() string } func speakFunc(animalType string) string { if animalType == "dog" { return "Woof!" } else if animalType == "cat" { return "Meow!" } return "" } func createSpeaker(f func(string) string, t string) Speaker { return &struct{ // 返回的是一个实现了Speaker接口的对象 speak func() string }{speak: func() string { return f(t) }} } func main() { dog := createSpeaker(speakFunc, "dog") // 动态构建Dog类型的speaker cat := createSpeaker(speakFunc, "cat") // 动态构建Cat类型的speaker fmt.Println(dog.Speak()) // 输出 Woof! fmt.Println(cat.Speak()) // 输出 Meow! } ``` 这里展示了如何基于不同的输入参数(如 `"dog"` 或者 `"cat"`),通过同一个基础逻辑 (`speakFunc`) 构建出不同行为的具体实现[^2]。 --- #### 总结 以上两种方案都可以有效解决“如何在 Golang 中通过函数实现接口”的问题。第一种更适合于那些希望保持清晰分离业务逻辑与接口实现关系的情况;第二种则适合追求极致性能优化的应用场合下采用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值