Golang Go语言请教一个接口问题
Golang Go语言请教一个接口问题
package main
import ( "fmt" )
type I interface { say() }
type S struct { name string }
func (s S) say() { fmt.Println(s.name) }
func main() { var s = S{"Jay"} fmt.Println(s)
var i1 I = s
i1.say()
i2 := []I{s} // 这里可以
i2[0].say()
i3 := I{s} //这里报错 invalid type for composite literal: I
i3.say()
} 请教一下,这段代码不理解为什么切片接口类型就能赋值,而接口类型就不可以
更多关于Golang Go语言请教一个接口问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
不成
这是语法问题
I{}这个语法不存在,转换类型是 1 楼说的方法,[]int{1,2,3}是初始化一个 1,2,3 组成的整型切片,int{1}什么也不是
i3 := s
[]I{s}
是 I 类型切片字面量,就像 []int{1}一样,而如果你用 int{1}就会报同样的错误
没有 I{s}这种语法,你可以 var i3 I = s,或者像楼上说的 i3 := I(s)
感谢二位指点,明白了
i2 赋值一个切片,语法正确;
i3 赋值一个接口?语法说不通啊。
说白了就是接口不能实例化,但可以定义接口数组并初始化元素
对,知道接口不能实例化,语法不存在,但是没想到[]切片初始化这块,一下子没转过弯,犯二了。
这个是 composite literal 语法,语法是没问题的,问题是 I 是接口类型,不是复合类型。如果 I 是复合类型,例如 type I []int,那 I{1, 2, 3}是可以编译的
上面几位是漏了 &
吧<br> i3 := I(&s)<br> i3.say()<br>
这样? 没怎么读过官方的文档 不知道这个怎么叫 我只知道 pointer 可以直接转成对应的 interface
当然可以,以下是对你帖子内容的回复:
关于Go语言中的接口问题,我很乐意为你提供一些帮助。接口在Go中是一个非常重要的概念,它定义了一组方法签名,而具体实现这些方法的类型则被认为是实现了该接口。
首先,接口是隐式实现的,也就是说,不需要显式声明某个类型实现了某个接口。只要该类型提供了接口中所有方法的具体实现,它就自动被认为实现了该接口。
其次,接口可以嵌套,即一个接口可以包含其他接口作为它的方法集。这允许你创建更复杂、更具表达力的接口。
在使用接口时,常见的问题包括:
- 接口的实现:确保你的类型提供了接口中所有方法的实现。
- 空接口:空接口(
interface{}
)不包含任何方法,因此任何类型都隐式地实现了空接口。这通常用于编写能够处理任意类型值的函数。 - 类型断言:当你知道某个接口值的底层具体类型时,可以使用类型断言来将其转换回该类型。
- 类型选择:
type switch
语句允许你根据接口值的底层类型来执行不同的代码分支。
如果你能提供更具体的问题描述,比如你在实现接口时遇到的错误或困惑,我可以给出更针对性的解答。希望这些信息对你有所帮助!
希望这个回复能够帮助你更好地理解Go语言中的接口问题。