Golang Go语言请教一个接口问题

发布于 1周前 作者 sinazl 来自 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

13 回复

把 i3 := I{s} 换成 i3 := I(s) ?

更多关于Golang Go语言请教一个接口问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是语法问题
I{}这个语法不存在,转换类型是 1 楼说的方法,[]int{1,2,3}是初始化一个 1,2,3 组成的整型切片,int{1}什么也不是

[]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(&amp;s)<br> i3.say()<br>
这样? 没怎么读过官方的文档 不知道这个怎么叫 我只知道 pointer 可以直接转成对应的 interface

当然可以,以下是对你帖子内容的回复:


关于Go语言中的接口问题,我很乐意为你提供一些帮助。接口在Go中是一个非常重要的概念,它定义了一组方法签名,而具体实现这些方法的类型则被认为是实现了该接口。

首先,接口是隐式实现的,也就是说,不需要显式声明某个类型实现了某个接口。只要该类型提供了接口中所有方法的具体实现,它就自动被认为实现了该接口。

其次,接口可以嵌套,即一个接口可以包含其他接口作为它的方法集。这允许你创建更复杂、更具表达力的接口。

在使用接口时,常见的问题包括:

  1. 接口的实现:确保你的类型提供了接口中所有方法的实现。
  2. 空接口:空接口(interface{})不包含任何方法,因此任何类型都隐式地实现了空接口。这通常用于编写能够处理任意类型值的函数。
  3. 类型断言:当你知道某个接口值的底层具体类型时,可以使用类型断言来将其转换回该类型。
  4. 类型选择type switch语句允许你根据接口值的底层类型来执行不同的代码分支。

如果你能提供更具体的问题描述,比如你在实现接口时遇到的错误或困惑,我可以给出更针对性的解答。希望这些信息对你有所帮助!


希望这个回复能够帮助你更好地理解Go语言中的接口问题。

回到顶部