go 函数 方法 接口
- 概论
- 函数
- 方法
- 接口
概论
- 方法在编译时静态绑定,依托于具体的类型
- 接口对应的方法是在运行时动态绑定
- 进程内初始化顺序 初始化导入包的常量和变量(可以导出的变量)--->包的init函数,不同文件内顺序是未定义的, 同一文件调用顺序是定义顺序--->main包内的常量变量和init---->main函数
函数调用顺序图

函数
可变数量的参数必须最后出现,本质是一个切片类型的参数
可变参数是一个空接口类型时,调用者是否解包可变参数会导致不同的结果
func main() {
var a = []interface{}{123, "abc"} Print(a...) // 123 abc 解包参数==》Print(123, "abc")
Print(a) // [123 abc] 不接包==》Print([]interface{}{123, "abc"})
} func Print(a ...interface{}) {
fmt.Println(a...)
}
空接口类型:没有任何方法
传参都是传值
- append为什么必须有返回值:因为切片结构包含底层数组的指针, 长度和容量, 函数可以通过指针修改切片内容但是长度和容量无法修改,所以必须有返回值,带回被改变的长度和容量
不用考虑堆栈位置,GC会自动设置变量存放位置
方法
- 绑定在具体的类型,编译时静态绑定
- 一个类型绑定的函数实现了接口的所有函数,这个类型就实现了这个接口
- c实现的面向对象只用将相应的类型作为函数第一个参数传入
- 没有传统面向对象的继承,通过组合来实现继承
接口
- 接口可以实现虚函数的多态性,运行时确定,延迟绑定
- 创建一个新的接口类型满足已经存在的具体类型而不用破坏这些类型的原有定义
- 基础类型不支持隐士转换
- 结构体内可以包含接口类型,纯虚函继承
空接口
没有任何方式
空接口内部实现保存了对象的类型和指针
空接口可以保存任何对象,类似于一个集装箱,存放物品
// 声明a变量, 类型int, 初始值为1
var a int = 1
// 声明i变量, 类型为interface{}, 初始值为a, 此时i的值变为1
var i interface{} = a
// 声明b变量, 尝试赋值i
var b int = i //出错,因为i是接口类型的,也不能显示转化
var i interface{} = 5667
j := i.(int)
fmt.Printf("%T->%d\n", j, j) //使用类型断言来转换,不安全的转化
空接口比较:类型和指针比较, 两个都一样才一样;
不能比较空接口中的动态值
| 类 型 | 说 明 |
|---|---|
| map | 宕机错误,不可比较 |
| 切片([]T) | 宕机错误,不可比较 |
| 通道(channel) | 可比较,必须由同一个 make 生成,也就是同一个通道才会是 true,否则为 false |
| 数组([容量]T) | 可比较,编译期知道两个数组是否一致 |
| 结构体 | 可比较,可以逐个比较结构体的值 |
| 函数 | 可比较 |
类型断言
- x.(T) x是interface()类型, T是要断言的类型
- 使用场景:当某个interface{}的变量真是类型为A时才做某件事
- 相当于赋值给void*的真实类型
go 函数 方法 接口的更多相关文章
- Golang 函数 方法 接口的简单介绍
函数 函数是基本的代码块,通常我们会将一个功能封装成一个函数,方便我们调用,同时避免代码臃肿复杂. 函数的基本格式 func TestFunc(a int, b string) (int, strin ...
- [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口
函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...
- 如何设计PHP业务模块(函数/方法)返回结果的结构?
如题:如何设计业务模块返回结果的结构? 一个业务函数/方法执行后,对外输出数据的结构通常有以下几种: 1.返回数字,如 成功时返回 0,失败时返回 -1,有的还会用一个全局变量输出错误信息: < ...
- paip.函数方法回调机制跟java php python c++的实现
paip.函数方法回调机制跟java php python c++的实现 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...
- typescript函数类型接口
/* 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据, ...
- 29 匿名内部类、函数型接口、lamda表达式的引入
匿名内部类 参考:https://www.runoob.com/w3cnote/java-inner-class-intro.html 进入后搜索匿名内部类. 函数型接口 函数式接口(Function ...
- JVM 专题十四:本地方法接口
1. 本地方法接口 2. 什么是本地方法? 简单来讲,一个Native Method就是一个Java调用非Java代码的接口.一个Native Method是这样一个java方法:该方法的实现由非Ja ...
- JVM--先说本地方法接口
本地方法接口 在讲Java虚拟机运行时数据区中本地方法栈之前,我们先来说说运行时数据区之外的一个叫本地方法接口的东西简称JNI(Java Native Interface) 简单来讲,一个Native ...
- 你真的会玩SQL吗?实用函数方法汇总
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
随机推荐
- vue2.x学习笔记(五)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12571062.html. 计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.如果在模板中放入太 ...
- redis:key命令(二)
设置一个key:set name hello 获取一个key的值:get name 查看所有的key:keys * 查看key是否存在:exists name 移动key到指定库:move name ...
- 从零开始学习docker之docker的安装
一.Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程 ...
- ACNet: 特别的想法,腾讯提出结合注意力卷积的二叉神经树进行细粒度分类 | CVPR 2020
论文提出了结合注意力卷积的二叉神经树进行弱监督的细粒度分类,在树结构的边上结合了注意力卷积操作,在每个节点使用路由函数来定义从根节点到叶子节点的计算路径,结合所有叶子节点的预测值进行最终的预测,论文的 ...
- TensorFlow keras vgg16net的使用
from tensorflow.python.keras.applications.vgg16 import VGG16,preprocess_input,decode_predictions fro ...
- keras API的使用,神经网络层,优化器,损失函数,查看模型层数,compile和fit训练
layers介绍 Flatten和Dense介绍 优化器 损失函数 compile用法 第二个是onehot编码 模型训练 model.fit 两种创建模型的方法 from tensorflow.p ...
- 二分查找(通过相对位置判断区间位置)--17--二分--LeetCode33搜索旋转排序数组
搜索旋转排序数组 假设按照升序排序的数组在预先未知的某个点上进行了旋转.( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中 ...
- 双链表【参照redis链表结构】
参照了Redis里面的双链表结构,可以说是完全复制粘贴,redis的双链表还是写的很通俗易懂的,没有什么花里胡哨的东西,但是redis还有个iter迭代器的结构来遍历链表.我这里就没有实现了,只是实现 ...
- 异常:NoSuchFieldError: BEST_MATCHING_HANDLER_ATTRIBUTE
出现的原因 pom 依赖之间不匹配导致 当前的 pom 调整后访问资源成功后面的 pom
- python实现逻辑回归
首先得明确逻辑回归与线性回归不同,它是一种分类模型.而且是一种二分类模型. 首先我们需要知道sigmoid函数,其公式表达如下: 其函数曲线如下: sigmoid函数有什么性质呢? 1.关于(0,0. ...