当前位置: 首页 > news >正文

成都互联网网站建设/小红书关键词排名

成都互联网网站建设,小红书关键词排名,9377 这种网站怎么做,wordpress怎么搜索别人的文章1.接口定义 1.1 接口是一个或多个方法签名的集合,任何类型的方法集中只要拥有与之对应的全部方法,就表示它 “实现” 了该接口,无须在该类型上显式添加接口声明。 所谓对应方法,是指有相同名称、参数列表 (不包括参数名) 以及返…

1.接口定义

1.1 接口是一个或多个方法签名的集合,任何类型的方法集中只要拥有与之对应的全部方法,就表示它 “实现” 了该接口,无须在该类型上显式添加接口声明。

  • 所谓对应方法,是指有相同名称、参数列表 (不包括参数名) 以及返回值。当然,该类型还可以有其他方法。
    • 接口命名习惯以 er 结尾,结构体
    • 接口只有方法签名,没有实现
    • 接口没有数据字段
    • 可在接口中嵌入其他接口
    • 类型可实现多个接口
package mainimport "fmt"type Stringer interface {String() string
}type Printer interface {Stringer // 接⼝口嵌⼊入。Print()
}type User struct {id   intname string
}func (self *User) String() string {return fmt.Sprintf("user %d, %s", self.id, self.name)
}func (self *User) Print() {fmt.Println(self.String())
}func main() {var t Printer = &User{1, "Tom"} // *User ⽅方法集包含 String、Print。t.Print()
}

1.2 空接口 interface{} 没有任何方法签名,也就意味着任何类型都实现了空接口。其作用类似面向对象语言中的根对象 Object。

func Print(v interface{}) {fmt.Printf("%T: %v\n", v, v)
}func main() {Print(1)Print("Hello, World!")
}
//输出
int: 1
string: Hello, World!

1.3 匿名接口可用作变量类型,或结构成员

package mainimport "fmt"type Tester struct {s interface {String() string}
}type User struct {id   intname string
}func (self *User) String() string {return fmt.Sprintf("user %d, %s", self.id, self.name)
}func main() {t := Tester{&User{1, "Tom"}}fmt.Println(t.s.String())
}

1.4 执行机制

  • 接口对象由接口表 (interface table) 指针和数据指针组成。
    -runtime.h
struct Iface
{Itab* tab;void* data;
};struct Itab
{InterfaceType* inter;Type* type;void (*fun[])(void);
};
  • 接口表存储元数据信息,包括接口类型、动态类型,以及实现接口的方法指针。无论是反射还是通过接口调用方法,都会用到这些信息
  • 数据指针持有的是目标对象的只读复制品,复制完整对象或指针
package mainimport "fmt"type User struct {id   intname string
}func main() {u := User{1, "Tom"}var i interface{} = uu.id = 2u.name = "Jack"fmt.Printf("%v\n", u)fmt.Printf("%v\n", i.(User))
}
  • 接口转型返回临时对象,只有使用指针才能修改其状态
package mainimport "fmt"type User struct {id   intname string
}func main() {u := User{1, "Tom"}var vi, pi interface{} = u, &u// vi.(User).name = "Jack" // Error: cannot assign to vi.(User).namepi.(*User).name = "Jack"fmt.Printf("%v\n", vi.(User))fmt.Printf("%v\n", pi.(*User))
}
  • 只有 tab 和 data 都为 nil 时,接口才等于 nil。
var a interface{} = nil // tab = nil, data = nil
var b interface{} = (*int)(nil) // tab 包含 *int 类型信息, data = niltype iface struct {itab, data uintptr
}ia := *(*iface)(unsafe.Pointer(&a))
ib := *(*iface)(unsafe.Pointer(&b))fmt.Println(a == nil, ia)
fmt.Println(b == nil, ib, reflect.ValueOf(b).IsNil())
//输出:
true {0 0}
false {505728 0} true

2. 接口转换

2.1 利用类型推断,可判断接口对象是否某个具体的接口或类型。

type User struct {id intname string
}func (self *User) String() string {return fmt.Sprintf("%d, %s", self.id, self.name)
}func main() {var o interface{} = &User{1, "Tom"}if i, ok := o.(fmt.Stringer); ok { // ok-idiomfmt.Println(i)}u := o.(*User)// u := o.(User) // panic: interface is *main.User, not main.Userfmt.Println(u)
}

2.2 还可用 switch 做批量类型判断,不支持 fallthrough。

func main() {var o interface{} = &User{1, "Tom"}switch v := o.(type) {case nil: // o == nilfmt.Println("nil")case fmt.Stringer: // interfacefmt.Println(v)case func() string: // funcfmt.Println(v())case *User: // *structfmt.Printf("%d, %s\n", v.id, v.name)default:fmt.Println("unknown")}
}

2.3 超集接口对象可转换为子集接口,反之出错。

type Stringer interface {String() string
}type Printer interface {String() stringPrint()
}type User struct {id intname string
}func (self *User) String() string {return fmt.Sprintf("%d, %v", self.id, self.name)
}func (self *User) Print() {fmt.Println(self.String())
}func main() {var o Printer = &User{1, "Tom"}var s Stringer = ofmt.Println(s.String())
}

2.4 接口技巧

  • 让编译器检查,以确保某个类型实现接口
var _ fmt.Stringer = (*Data)(nil)
//
type Tester interface {Do()
}type FuncDo func()
func (self FuncDo) Do() { self() }func main() {var t Tester = FuncDo(func() { println("Hello, World!") })t.Do()
}
http://www.jmfq.cn/news/5274829.html

相关文章:

  • 教育培训网站建设方案模板/外贸营销平台
  • scratch编程免费下载/seo流量
  • 临沂哪家做网站最好/凡科建站下载
  • 甘孜建设网站首页/免费网站seo排名优化
  • 如何做一个网站的功能吗/搜索引擎推广一般包括哪些
  • 千峰培训多少钱/搜索引擎环境优化
  • wordpress jd哪个好/万能优化大师下载
  • 合肥做企业网站/广东今日最新疫情通报
  • 服务器做网站教程/优化设计方案
  • 自适应网站建设服务哪家好/app软件开发
  • 基于cms系统网站的建设/东莞优化排名公司
  • 移动网站建设动态/网站维护是什么意思
  • 网站维护 推广/免费推广引流app
  • 西安做网站公司哪家好 应该怎么选择/无锡网站建设优化公司
  • 站长工具seo综合查询下载安装/关键词整站优化
  • 做网站公司排行/登录百度账号注册
  • 广州建设银行投诉网站/关键词完整版免费听
  • 城阳建网站/网页设计制作网站模板图片
  • b站推广网站2024不用下载/网络推广代运营公司
  • 根据网站日志做seo/教你免费申请个人网站
  • 网站建设案例教程/360网站推广官网
  • wordpress主题更新无法创建目录/网站seo外链平台
  • 网站最下面版权模板/泉州seo报价
  • 做做同城网站好还是做垂直网站好/ui设计公司
  • 百度如何建网站/徐州百度搜索网站排名
  • 有平面广告设计的网站/百度高级搜索引擎
  • 做网站卖东西/百度竞价推广屏蔽软件
  • 资源网站很难做/无锡网站关键词推广
  • 什么网站可以在图片上做超链接/网络广告策划案例
  • 二手书交易网站开发背景分析/搜索大全引擎入口网站