“7babb3d231f30678e47c82b866deb21635552a58”上不存在“test/cpp/inference/api/analyzer_capi_exp_xpu_tester.cc”
提交 7b4fc69d 编写于 作者: 彭世瑜's avatar 彭世瑜

fix

上级 c0805a9b
# 第十八章 Golang接口 interface
go语言中的接口,是一种新的类型定义,它把所有的具有共性的方法定义在一起,任何其他类型制药实现了这些方法就是实现了这个接口
语法
```go
// 定义接口
type interface_name interface {
method_name [return_type]
...
}
// 定义结构体
type struct_name struct {
}
// 实现接口方法
func (struct_name_variable struct_name) method_name [return_type]{
// 方法实现
}
```
接口示例
定义一个USB接口,有读read 写write两个方法
再定义一个电脑computer 和 手机Mobile 来实现这个接口
```go
package main
import "fmt"
// USB接口
type USB interface {
read()
write()
}
// Computer 结构体
type Computer struct {
}
// Mobile 结构体
type Mobile struct {
}
// Computer 实现USB方法
func (computer Computer) read() {
fmt.Println("computer read")
}
func (computer Computer) write() {
fmt.Println("computer write")
}
// Mobile 实现USB方法
func (mobile Mobile) read() {
fmt.Println("mobile read")
}
func (mobile Mobile) write() {
fmt.Println("mobile write")
}
func main() {
computer := Computer{}
computer.read()
computer.write()
// computer read
// computer write
mobile := Mobile{}
mobile.read()
mobile.write()
// mobile read
// mobile write
}
```
> 备注: 实现接口必须实现接口中的所有方法
......@@ -360,6 +360,7 @@ func main() {
var person = new(Person)
// 访问结构体指针成员,可以省略*
// 自动解引用
(*person).age = 23
person.id = 12
person.name = "Tom"
......@@ -460,3 +461,167 @@ func main() {
}
```
## 结构体的嵌套
示例
```go
package main
import "fmt"
type Dog struct {
age int
name string
}
type Person struct {
age int
name string
dog Dog
}
func main() {
dog := Dog{
age: 1,
name: "dog",
}
person := Person{
dog: dog,
age: 11,
name: "Tom",
}
fmt.Printf("%v\n", person)
// {11 Tom {1 dog}}
fmt.Printf("%v\n", person.dog.name)
// dog
}
```
## 方法
golang中,方法是一种特殊的函数
定义与struct之上(与struct关联、绑定),被称为struct的接受者(receiver)
通俗讲,方法就是有接收者的函数
语法格式
```go
type struct_name struct{}
func (recv struct_name) method_name(param_type) return_type{}
func (recv *struct_name) method_name(param_type) return_type{}
```
```go
package main
import "fmt"
// 属性和方法分开写
type Person struct {
age int
name string
}
// Person 接收者 receiver
func (person Person) eat() {
fmt.Printf("%v eat\n", person.name)
}
func (person Person) sleep() {
fmt.Printf("%v sleep\n", person.name)
}
func main() {
person := Person{
age: 11,
name: "Tom",
}
person.eat()
// Tom eat
person.sleep()
// Tom sleep
}
```
go语言方法的注意事项
- 方法的receiver type可以是类型别名、struct、slice、map、channel、func等
- struct结合它的方法等价于面向对象中的类,只不过struct可以和它的方法分开写,并非一定要属于同一个文件,但是,必须属于同一个包
- 方法有两种接收类型`(T type)``(T *Type)`,它们之间有区别
- 方法就是函数,所有Go中没有方法重载overload的说法,也就是说同一个类型中的所有方法名必须唯一
- 如果receiver是一个指针类型,则会自动解除引用
- 方法和type是分开的,意味着实例的行为behavior和数据存储field是分开的,但它们通过receiver建立起关联关系
## 方法接收者类型
- 值类型:复制结构体副本
- 指针类型:不复制
```go
package main
import "fmt"
// Person 接收者 receiver
type Person struct {
age int
name string
}
// 值传递,拷贝了一份副本
func (person Person) showPersonByValue() {
person.age = 12
person.name = "Jack"
fmt.Printf("%v\n", person)
}
// 指针传递
func (person *Person) showPersonByPointer() {
person.age = 12
person.name = "Jack"
fmt.Printf("%v\n", person)
}
func main() {
person := Person{
age: 11,
name: "Tom",
}
fmt.Printf("%v\n", person)
// {11 Tom}
// 接收者类型是变量,值没有被修改
person.showPersonByValue()
// {12 Jack}
fmt.Printf("%v\n", person)
// {11 Tom}
// 接收者类型是指针,值被修改
person.showPersonByPointer()
// &{12 Jack}
fmt.Printf("%v\n", person)
// {12 Jack}
}
```
\ No newline at end of file
......@@ -42,9 +42,10 @@
[第十七章 Golang 结构体 struct](/blog/golang/golang-struct.md)
[第十八章 Golang接口 interface](/blog/golang/golang-interface.md)
https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=54&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=58&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册