• 概论
  • 函数
  • 方法
  • 接口

概论

  • 方法在编译时静态绑定,依托于具体的类型
  • 接口对应的方法是在运行时动态绑定
  • 进程内初始化顺序 初始化导入包的常量和变量(可以导出的变量)--->包的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 函数 方法 接口的更多相关文章

  1. Golang 函数 方法 接口的简单介绍

    函数 函数是基本的代码块,通常我们会将一个功能封装成一个函数,方便我们调用,同时避免代码臃肿复杂. 函数的基本格式 func TestFunc(a int, b string) (int, strin ...

  2. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  3. 如何设计PHP业务模块(函数/方法)返回结果的结构?

    如题:如何设计业务模块返回结果的结构? 一个业务函数/方法执行后,对外输出数据的结构通常有以下几种: 1.返回数字,如 成功时返回 0,失败时返回 -1,有的还会用一个全局变量输出错误信息: < ...

  4. paip.函数方法回调机制跟java php python c++的实现

    paip.函数方法回调机制跟java php python c++的实现 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...

  5. typescript函数类型接口

    /* 接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据, ...

  6. 29 匿名内部类、函数型接口、lamda表达式的引入

    匿名内部类 参考:https://www.runoob.com/w3cnote/java-inner-class-intro.html 进入后搜索匿名内部类. 函数型接口 函数式接口(Function ...

  7. JVM 专题十四:本地方法接口

    1. 本地方法接口 2. 什么是本地方法? 简单来讲,一个Native Method就是一个Java调用非Java代码的接口.一个Native Method是这样一个java方法:该方法的实现由非Ja ...

  8. JVM--先说本地方法接口

    本地方法接口 在讲Java虚拟机运行时数据区中本地方法栈之前,我们先来说说运行时数据区之外的一个叫本地方法接口的东西简称JNI(Java Native Interface) 简单来讲,一个Native ...

  9. 你真的会玩SQL吗?实用函数方法汇总

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

随机推荐

  1. #4018. 统计n! 尾部零

    题目出处: http://www.51cpc.com/problem/4018 题目描述 试统计正整数n的阶乘n!=1×2×3×…×n尾部连续零的个数. 输入格式 输入正整数n 输出格式 输出个数 样 ...

  2. 牛顿迭代法的理解与应用( x 的平方根)

    题目来源与LeetCode算法题中的第69题,具体内容如下(点击查看原题): 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只 ...

  3. php内置函数call_user_func()

    <?php //call_user_func(callback,name,age) //第一个参数callback作为回掉函数使用,其余的参数是他的参数 function now($a,$b) ...

  4. OSG加载倾斜摄影数据

    目录 1. 概述 2. 实例 2.1. 代码 2.2. 解析 3. 结果 1. 概述 ContextCapture(Smart3D)生成的倾斜摄影模型数据一般都形如如下组织结构: 在Data目录下包含 ...

  5. tensor的复制函数torch.repeat_interleave()

    1. repeat_interleave(self: Tensor, repeats: _int, dim: Optional[_int]=None) 参数说明: self: 传入的数据为tensor ...

  6. dotnetcore配置框架简介

    一.前言 配置的本质就是字符串的键值对,微软的一系列接口其实就是对这些键值对字符串的抽象. 二.基本类型 2.1.Nuget包 Microsoft.Extensions.Configuration.A ...

  7. Clustered和Nonclustered Indexes 各自得特点和区别及长短处

    1 簇索引 簇索引对表的物理数据页中的数据按列进行排序然后再重新存储到磁盘上即簇索 引与数据是混为一体的它的叶节点中存储的是实际的数据由于簇索引对表中的数据一 一进行了排序因此用簇索引查找数据很快但由 ...

  8. PostgreSQL 10.0 preview 性能增强 - 分区表性能增强(plan阶段加速)

    标签 PostgreSQL , 10.0 , 分区表 , 子表 , 元信息搜索性能增强 背景 PostgreSQL 10.0 增强了分区表的子表搜索性能,对于涉及分区表包含子表特别多的QUERY,可以 ...

  9. 剑指offer---05---用栈实现队列

    题意 给了两个栈去实现队列   分析 两个栈如下情况       1       2 4    3 这个时候就不能够把4插入到第二个弹出栈了否则弹出顺序出错. 所以这个时候就应该等第二个栈空了的时候再 ...

  10. Python之路【第二十八篇】:生成器与迭代器

    #!/usr/bin/env python # -*- coding:utf-8 -*- #只要函数的代码里面出现了yield关键字,这个函数就不再是一个普通的函数了,叫做生成器函数 #执行生成器函数 ...