gpt4 book ai didi

go - Golang 中的空接口(interface)

转载 作者:行者123 更新时间:2023-12-01 21:15:29 26 4
gpt4 key购买 nike

编辑 : 这是不是 在 Go 中使用接口(interface)的正确方法。这个问题的目的是让我了解 Go 中的空接口(interface)是如何工作的。

如果 Go 中的所有类型都实现了 interface{} (空界面),为什么我无法访问name Cat 中的字段和 Dog结构?如何通过函数 sayHi() 访问每个结构的名称字段?

package main

import (
"fmt"
)

func sayHi(i interface{}) {

fmt.Println(i, "says hello")

// Not understanding this error message
fmt.Println(i.name) // i.name undefined (type interface {} is interface with no methods)
}

type Dog struct{
name string
}
type Cat struct{
name string
}

func main() {
d := Dog{"Sparky"}
c := Cat{"Garfield"}

sayHi(d) // {Sparky} says hello
sayHi(c) // {Garfield} says hello
}

最佳答案

一个 interface{}是方法集,而不是字段集。如果一个类型的方法包含该接口(interface)的方法,则该类型实现该接口(interface)。由于空接口(interface)没有任何方法,所有类型都实现它。

如果你需要访问一个字段,你必须得到原始类型:

name, ok:=i.(Dog).name

如果 i,这将恢复名称是 Dog .

或者,实现 getName()两个函数 DogCat ,然后它们都将实现以下接口(interface):
type NamedType interface {
getName() string
}

然后你可以将你的函数重写为:
func sayHi(i NamedType) {
fmt.Println(i.getName())
}

关于go - Golang 中的空接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59976812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com