Go语言中文网 为您找到相关结果 397

关于接口的小问题

刚开始学go语言,在最近学习go指南里遇到一个问题,貌似一个结构体,或者说被type语法定义的新类型,目前是结构体和基本类型的新名字,在实现error和Stringers接口之后,使用Println方法时调用会有优先级,想问问大佬们为什么会这样。

下面是代码


package main
import (
	"fmt"
)
type MyError struct {
	What string
}
func (e MyError) Error() string {
	return "Error()"
}
func (e MyError) String() string{
	return "String()"
}
func...阅读全文

理解 Golang 中函数调用的原理

Home Menu 理解 Golang 中函数调用的原理 20 Jan 2019 Golang Go实现原理 函数调用 调用惯例 参数传递 调用惯例 C 语言 Golang 参数传递 整型和数组 结构体和指针 小结 总结 Reference 函数是 Go 语言中的一等公民,理解和掌握函数的调用过程是深入学习 Golang 时无法跳过的步骤,这里会介绍 Go 语言中函数调用的过程和实现原理并与 C 语言中函数执行的过程进行对比,同时对参数传递的原理进行剖析,让读者能够清楚地知道 Go 在函数的执行过程中究竟都做了哪些工作。 本文将从函数的调用惯例和参数的传递方法两个方面分别介绍函数的执行过程,同时在这里会默认阅读这篇文章的读者已经掌握了 栈、寄存器 等概念,文章并不会就这两部分内容展开进行介绍...阅读全文

博文 2019-03-19 12:20:04 draveness.me

求大神解答,在go语言动态形成的网页中怎么用range调用前一个range出来的值

![问题.png](http://studygolang.qiniudn.com/170817/ac27bbd19b13aa1fd901875a31fecd4e.png) 我自己定义了一个结构体,然后,local.Name是一个[]string,local.Ipv是一个map,希望先range出来name之后然后用range $.Ipv.name(刚刚第一个range出来的name)打出该name在map中的对应项,求大神打...阅读全文

defer的使用规则

在golang当中,defer代码块会在函数调用链表中增加一个函数调用。这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用。因此,defer通常用来释放函数内部变量。 为了更好的学习defer的行为,我们首先来看下面一段代码: func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName) if err != nil { return } dst, err := os.Create(dstName) if err != nil { return } written, err = io.Copy(dst, src) dst....阅读全文

Golang丰富的I/O 二----cgo版Hello World

h1 { margin-top: 0.6cm; margin-bottom: 0.58cm; direction: ltr; color: #000000; line-height: 200%; text-align: justify; page-break-inside: avoid; orphans: 0; widows: 0 } h1.western { font-family: "Times New Roman", serif; font-size: 22pt } h1.cjk { font-family: "宋体" } h1.ctl { font-family: "Times New Roman", serif; font-size: 10pt; font-weight: norm...阅读全文

博文 2017-11-29 09:05:06 majianguo

Defer, Panic, Recover

1、简介 Go具有控制流程的常用机制:if,for,switch,goto。 它还有go语句在单独的goroutine中运行代码。 在这里,我想讨论一些不太常见的问题:Defer,Panic和Recover。 2、Defer Defer语句将函数调用推送到列表中。 周围函数返回后执行已保存调用的列表。 Defer通常用于简化执行各种清理操作的功能。 例如,让我们看一个打开两个文件并将一个文件的内容复制到另一个文件的函数: func CopyFile(dstName, srcName string) (written int64, err error) { src, err := os.Open(srcName) if err != nil { return } dst, err := os....阅读全文

golang中defer的使用规则

自个人博客chinazt.cc 在golang当中,defer代码块会在函数调用链表中增加一个函数调用。这个函数调用不是普通的函数调用,而是会在函数正常返回,也就是return之后添加一个函数调用。因此,defer通常用来释放函数内部变量。 为了更好的学习defer的行为,我们首先来看下面一段代码: func CopyFile(dstName, srcName string) (written int64, err error) {src, err := os.Open(srcName)if err != nil {return} dst, err := os.Create(dstName)if err != nil {return} written, err = io.Copy(dst, ...阅读全文

博文 2018-08-20 12:30:02 wjq310

《Go语言四十二章经》第十五章 错误处理

《Go语言四十二章经》第十五章 错误处理 作者:李骁 ## 15.1 错误类型 任何时候当你需要一个新的错误类型,都可以用 errors(必须先 import)包的 errors.New 函数接收合适的错误信息来创建,像下面这样: ```go err := errors.New("math - square root of negative number") func Sqrt(f float64) (float64, error) { if f < 0 { return 0, errors.New ("math - square root of negative number") } } ``` 用 fmt 创建错误对象: 通常你想要返回包含错误参数的更有信息量的字符串,例如:可以用 fm...阅读全文

博文 2018-10-10 21:42:56 roteman

Go实战--golang中defer的使用(有事没事defer一下)

生命不止,继续 go go go !!! 学习golang这么久了,还没看到类似传统的 try…catch…finally 这种异常捕捉方式。 但是,Go中引入的Exception处理:defer, panic, recover。 那么今天跟大家分享一下golang中的defer。闲言少叙,看一下defer的作用: Defer is used to ensure that a function call is performed later in a program’s execution, usually for purposes of cleanup. defer is often used where e.g. ensure and finally would be used in o...阅读全文

博文 2017-07-20 04:01:07 wangshubo1989

GoLang学习

Go函数 Go函数定义 func function_name( [parameter list] ) [return_types] { 函数体 } func:Go的函数声明关键字,声明一个函数。 function_name:函数名称,函数名和参数列表一起构成了函数签名。 parameter list:参数列表,指定的是参数类型、顺序、及参数个数。参数是可选的,即函数可以不包含参数。参数就像一个占位符,这是参数被称为形参,当函数被调用时,将具体的值传递 给参数,这个值被称为实际参数。 return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。这里需要注意的是Go函数支持多返回值。有些功能不需要返回值,这种情况下 return_types 不是必须的。 函...阅读全文

博文 2018-12-19 11:34:44 小寸头

闭包(Closure)

思考 当多个函数需要使用某个变量时,我们可以把该变量定义为全局变量。当某个变量只有一个特定函数才会使用到时,如果把它定义为全局变量,又不能保证其它函数不会使用它,这时候该怎么办呢?比如统计某个函数的访问次数,如果可以在函数内部定义一个变量,来记录其被访问到次数,岂不美哉? 定义 闭包是匿名函数的一种特殊用法,其引用了匿名函数外部的变量。用法与普通函数引用全局变量有一定的相似之处,但又不完全一样,就像是一个函数内部的全部变量。使用闭包可以达到数据隔离的目的。 举例 package main import "fmt" func main() { counterFun := newCounter() fmt.Println(counterFun()) //输出1 fmt.Println(count...阅读全文

博文 2019-08-28 23:32:58 moonbamboo

动态追踪技术(四):基于 Linux bcc/BPF 实现 Go 程序动态追踪

摘要 原文:Brendan Gregg's Blog :《Golang bcc/BPF Function Tracing》,31 Jan 2017 引子:gdb、go execution tracer、GODEBUG、gctrace、schedtrace 一、gccgo Function Counting 二、Go gc Function Counting 三、Per-event invocations of a function 四、Interface Arguments 五、Function Latency 六、总结 七、Tips:构建 LLVM 和 Clang 开发工具库 在这篇文章中,我将迅速调研一种跟踪的 Go 程序的新方法:基于 Linux 4.x eBPF 实现动态跟踪。如果你...阅读全文

博文 2017-10-02 13:04:58 RiboseYim

记一次golang slice作为函数参数调用时的坑

场景:需要删除slice中第一个元素 stackoverflow上给出解决办法: Where a is the slice, and i is the index of the element you want to delete: a = append(a[:i], a[i+1:]...) ... is syntax for variadic arguments in Go. 经测试有效: s := []byte("helloworld") s = append(s[:0], s[1:]...) fmt.println(string(s))//输出结果为:elloworld 但是当我用函数调用的方式来删除slice中一个元素时,出现了非预期的现象: s := []byte("hellowo...阅读全文

博文 2020-02-20 19:32:51 舒小贱

golang下,调用Win的API,DnsQueryConfig,一直不成功,高手可以指点一下么【已解决,代码在文章结尾】

在项目`github.com/kbinani/win`下新建了文件`dnsapi.go`,代码如下: ```go // This file was automatically generated by https://github.com/kbinani/win/blob/generator/internal/cmd/gen/gen.go // go run internal/cmd/gen/gen.go // +build windows package win import "unsafe" var ( // Library libdnsapi uintptr // function dnsQueryConfig uintptr ) type DNS_CONFIG_TYPE uint32...阅读全文

博文 2020-05-02 12:36:28 huangen

问下 GO的列CSS JS 静态服务 如何访问URL的时候不展示列表但是可以调用里面的JS 图片等

~~~ http.StripPrefix("/static/", http.FileServer(http.Dir("static/")))) 这样就可以用静态服务里文件 有个缺陷 访问 static时候 直接列出当前目录全部文件了 感觉不安全 如何不展示这个呢? ~~~![QQ图片20180329211054.png](https://static.studygolang.com/180329/b77bcfdaa11c683e0263d95fc827e387.png...阅读全文

Learn Golang in Days - Day 13

Learn Golang in Days - Day 13 简介 递归 递归,就是自己调用自己 Go语言支持递归 类型转换 递归的应用 package main import "fmt" func Factorial(n uint64)(result uint64) { if(n > 0) { result = n * Factorial(n-1) } return 1 } func main() { var i int =15 fmt.Printf("%d 的阶乘是 %d\n", i, Factorial(uint64(i))) } 斐波那契数列 通过Go语言的递归函数实现斐波那契数列 package main import "fmt" func fibonacci(n int) int ...阅读全文

博文 2019-02-07 01:34:43 笑吧小鸟

golang 中的 defer

defer 是在return 之前执行的 但是return xxx 并不是一条原始指令 package main import ( "fmt" ) // my : 1 // res : 1 func f1() (result int) { defer func() { result++ }() return 0 } // my : 10 // res : 5 -- 我误判的原因, t为局部变量了. defer 影响的是局部变量 t. // -- r在return的时候已经拷贝赋值了. func f2() (r int) { t := 5 defer func() { t = t + 5 }() return t } // my : 1 func f3() (r int) { defer fu...阅读全文

博文 2019-04-10 01:34:42 个00个

go defer 的关键特性解读和示例

defer 的作用和执行时机go 的 defer 语句是用来延迟执行函数的,而且延迟发生在调用函数 return 之后,比如 1234func a() int { defer b() return 0} b 的执行是发生在 return 0 之后,注意 defer 的语法,关键字 defer 之后是函数的调用。 defer 的重要用途一:清理释放资源由于 defer 的延迟特性,defer 常用在函数调用结束之后清理相关的资源,比如 12f, _ := os.Open(filename)defer f.Close() 文件资源的释放会在函数调用结束之后借助 defer 自动执行,不需要时刻记住哪里的资源需要释放,打开和释放必须相对应。 用一个例子深刻诠释一下 defer 带来的便利和简洁。 ...阅读全文

博文 2017-07-28 13:54:52 三月沙

聊一聊goroutine stack

推送在外卖订餐中扮演着重要的角色,为商家实时接单、骑手实时派单提供基础的数据通道。早期推送是由第三方服务商提供的, 随着业务复杂度的提升、订单量和用户数的持续增长,之前的系统已经远远不能满足需求,构建一个高性能、高可用的推送系统势在必行。 今年上半年我们用go开发了一个hybrid push服务,用户在线则借助长连接下发消息,不在线则借助厂商或第三方通道下发消息。 在构建过程中遇到了些与 goroutine stack 相关的问题,这里就和大家扯一扯。带着问题阅读,往往会更加高效,首先让我们看下问题:goroutine stack多大呢?是固定的还是动态变化的呢?stack动态变化的话,什么时候扩容和缩容呢?如何实现的呢?对服务有什么影响吗?如何排查栈扩容缩容带来的问题呢?问题明确了,我们就...阅读全文

防止缓存击穿工具 singlefight 解读

缓存击穿 缓存击穿是指当缓存中的一个key过期时,对此数据的大量并发请求在缓存未重新生成时,会请求到数据库上。导致数据库的崩溃。 解决方案 大量并发请求的都是一个数据,只需要一个请求到达数据库然后设置缓存即可。所以需要控制其他请求等缓存生成之后再继续进行。 singleflight singleflight是groupCache中的一个工具。它的作用是: Package singleflight provides a duplicate function call suppression mechanism. 翻译过来意思是:包singleflight提供了一个重复的函数调用抑制机制。即singleflight可以让多次相同的函数调用实际上只执行一次,把第一次的执行结果直接赋值给其他调用。 ...阅读全文

类似 Go 中的表格驱动测试的步骤驱动评估

如果你听说过表驱动测试,那你就能更容易理解本文所描述的概念,因为它们使用的是相同的技术,只不过本文使用在非测试场景中。 假设你有一个函数,该函数中调用了多个其他函数。那么这个函数很可能主要有两个作用: 1. 检查出现的所有错误返回。 2. 传递一个函数的输出作为另一个函数的输入。 ```go // process is an example pipeline-like function. func queryFile(filename, queryText string) (string, error) { data, err := readData(filename) if err != nil { return nil, errors.Errorf("read data: %v", er...阅读全文

博文 2019-12-11 17:03:26 yangzhenxiong

golang package init 可以多处定义

在 golang 中 import 包 A 的时候,会自动隐式的调用该包A的 init() 函数。 调用顺序:如果该包A又import了别的包B,会优先调用包B的 init() 函数,最后才调用 main 包的 init() 函数。 一个包的 init() 函数可以定义多个,每个都会被调用,调用的顺序按文件名排序。 不光一个包可以定义多个init函数,同一个文件都可以定义多个init函数。调用顺序为代码顺序...阅读全文

博文 2019-06-14 18:02:39 风亡小窝

golang+cgo的搭建以及使用

摘要由于自己新的工作接触到了图像识别,于是开始从零开始整理自己怎么从一个空白到实现识别的完整功能所需要的技术要点。当然并不是完全的从零开始,前提条件至少会用go和c++,go简单很容易就能上手,如果你有开发的工作经验,学习go那是相当容易的。C++相对于go会比较困难点,但是笔者也没有做过c++的经历,也就大学学过c而已,照葫芦画瓢,依然能用的来c++,所以相信大家花点时间也能熟练的使用这两门语言。为什么要cgo所谓的cgo就是go调用c/c++或者是反过来,如果你是一名go开发者,由于现在很多强大的开源库是使用c/c++编写的,比如Opencv、Opengl、Zbar等等,你既想用又不想切换语言,那么cgo就是很好的选择,这将使你站在巨人的肩膀上开发出自己的应用程序。学会cgo将会打开你新...阅读全文

golang method注意事项

对于golang来说,T和*T属于两种不同的方法集,编写方法的时候,最好的办法就是保持某个类型方法集的一致性,只用一种receiver。 struct 变量只能调用值类型 receiver 的方法,但 struct 指针是能调用值类型和指针类型 receiver 的方法的。 基础类型不建议使用方法,本身按引用调用的变量,也不建议使用方法。 方法和变量的定义必须在同一个package下。 参考: https://www.jianshu.com/p/da264d9b1d00 https://golang.org/doc/faq#different_method_set...阅读全文

博文 2019-08-01 20:33:53 wuli學

golang-panic 和 recover

panic (抛出异常) 停止当前函数执行 一直向上返回,执行每一层的defer 如果没有遇见recover, 程序退出 recover (捕获异常) 仅在defer调用中使用 获取panic的值 如果无法处理,可重新panic package main import ( "errors" "fmt" ) func tryRecover(){ // 通过 defer 获取 panic 的错误 defer func() { r := recover() // 如果接收到的是一个 error 类型 if err, ok := r.(error); ok { // 捕获异常 fmt.Println("捕获了这个错误!", err) } else { // 重新抛出一个异常 panic(r) } }...阅读全文

博文 2019-12-17 22:32:42 爱吃豆包

OpenFalcon 源码分析(Nodata组件)

Nodata版本 VERSION = "0.0.11" Nodata组件功能 nodata用于检测监控数据的上报异常。nodata和实时报警judge模块协同工作,过程为: 配置了nodata的采集项超时未上报数据,nodata生成一条默认的模拟数据;用户配置相应的报警策略,收到mock数据就产生报警。采集项上报异常检测,作为judge模块的一个必要补充,能够使judge的实时报警功能更加可靠、完善。【官方描述】 Nodata组件逻辑图 系统流图 官方系统流图 模块结构 官方模块结构图 main入口分析 func main() { //命令参数解析 cfg := flag.String("c", "cfg.json", "configuration file") version := fla...阅读全文

博文 2018-09-20 09:34:42 Xiao_Yang

golang如何修改struct的未导出的域

golang如何修改struct的未导出的域 这里例子说明如何使用reflect包来访问修改未导出的域。 假设定义了package: package mypackage type MyStruct struct { ii int ss string aa []int } func NewMyStruct(i int, s string, a []int) *MyStruct { return & MyStruct { ii : i, ss : s, aa : a, } } 在main里面调用: package main import ( "reflect" "unsafe" "fmt" "mypackage" ) func main() { foo := mypackage.NewMyStr...阅读全文

博文 2018-11-09 17:34:59 CodingCode

Go 性能分析之案例一

思考 相信大家在实际的项目开发中会遇到这么一个事,有的程序员写的代码不仅bug少,而且性能高;而有的程序员写的代码能否流畅的跑起来,都是一个很大问题。而我们今天要讨论的就是一个关于性能优化的案例分析。 案例分析 我们先来构造一些基础数据(长度为10亿的切片,并赋上值): var testData = GenerateData() // generate billion slice data func GenerateData() []int { data := make([]int, 1000000000) for key, _ := range data { data[key] = key % 128 } return data } // get length func GetDataLe...阅读全文

博文 2019-06-15 17:32:38 WilburXu

defer,panic 和 Recover

翻译自:https://blog.golang.org/defer-panic-and-recover Golang的常用控制流程机制有:if,for,switch,goto,他还有go语句启动goroutine运行代码。在这里,我跟大家讨论一些不太常用的:defer,panic,recover defer 语句会将一个函数添加到函数调用列表,等defer所在的函数返回时,会调用这个列表的所有函数(后进先出的方式)。延迟通常用于简化执行各种清理操作。 例如,让我们看一个打开两个文件并将其中一个文件的内容拷贝到另一个文件的函数: func CopyFile(dstName, srcName string) (written uint64, err error) { src, err := os...阅读全文

博文 2019-03-09 18:34:40 我是黄小邪

golang-sync.WaitGroup

使用 go 语言提供的方式处理:sync.WaitGroup package main import ( "fmt" "sync" ) /** channel 例子六: 接收方,接收完毕的时候,通知发送我接收完毕了! 使用 Go 语言提供的 sync.WaitGroup 的方式,来等待任务结束处理!之前处理方式比较繁琐 // 使用 go 语言提供的等待组,等待组 var wq sync.WaitGroup // 表示有多少个任务,比如添加20个任务 wq.Add(20) // 每个任务做完后,在任务做完后调用 wq.Done() // 等待任务做完,在任务开始后调用 wq.Wait() */ // c 这个chan 表示数据 func donWorker6(id int, c chan in...阅读全文

博文 2019-12-18 12:32:43 爱吃豆包

2020-03-20

答案:People show b People show a 这是Golang的组合模式,可以实现OOP的继承。 被组合的类型People所包含的方法虽然升级成了外部类型Teacher这个组合类型的方法(一定要是匿名字段),但它们的方法(ShowA())调用时接受者并没有发生变化。 此时People类型并不知道自己会被什么类型组合,当然也就无法调用方法时去使用未知的组合者Teacher类型的功能。 package main import "fmt" type People struct {} type Teacher struct{ People } func (p *People) ShowB() { fmt.Println("People show b") p.ShowA() } fun...阅读全文

博文 2020-03-20 13:32:51 anthonydan

Go语言核心之美 3.1-数组

上一章我们深入学习了基本数据类型,它们是构建复杂数据类型的基础,是组成Go语言世界的原子。本章,我们将学习复合数据类型:通过不同的方式将基本类型组合起来。主要有四种复合类型--数组,切片(slice),map,结构体(struct),在本章末尾,我们将展示如何通过struct来进行JSON编解码,同时配合template模板来生成HTML页面。 数组和结构体都是聚合类型:数组是由元素组成,结构体由字段组成,无论是元素还是字段,在内存中都是连续排列的(这个极大的增加了内存的连续访问性,也是Go的一个重要优点,内存排列很紧密)。数组是同构类型--每个元素的类型都是相同的;结构体是异构类型--每个字段的类型都可以不同。数组和结构体的内存大小在初始化后都是固定的,相比之下,切片和map则是动态数据结...阅读全文

博文 2017-10-27 20:58:48 erlib

go中的方法学习

### 方法的定义 ``` func (recevier type) methodName(参数列表) (返回值列表){ 方法体 return 返回值 } ``` ### 方法的使用 1. 方法需要个定义的类型进行绑定 ``` type Person struct { Name string } func (p Person)testMothod(){ //绑定P类型 fmt.Println("Name =",p.Name) } func main() { person := Person{Name:"jack"} person.testMothod() } ``` 1. golang中的方法是作用在指定的数据类型上的(即:和指定的数据类型绑定),因此自定义类型,都可以有方法,而不仅仅是st...阅读全文

博文 2020-04-13 16:17:03 Mr_Pon

golang延迟调用函数defer

defer语句被⽤于预定对⼀个函数的调⽤。可以把这类被defer语句调⽤的函数称为延迟函数。 延迟的函数是按照后进先出(LIFO)的顺序执行 defer的作用 * 释放占用资源 * 捕捉异常状态 * 输出日志 func ReadWrite() bool { file.Open("file") defer file.Close() //file.Close() 被添加到了 defer 列表 // 做一些工作 if failureX { return false //Close() 现在自动调用 } if failureY { return false //这里也是 } return true //And here ...阅读全文

博文 2019-12-31 06:32:41 程序小白菜

Go 语言函数

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 函数是基本的代码块,用于执行一个任务。 Go 语言最少有个 main() 函数。 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。 函数声明告诉了编译器函数的名称,返回类型,和参数。 Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数字,则返回数组中包含的函数个数。 函数定义Go 语言函数定义格式如下: func function_name( [parameter list] ) [return_types] { 函数体}函数定义解析: func:函数由 func 开始声明functi...阅读全文

博文 2019-09-24 13:32:47 链客

Golang 类型

Go语言的类型很多,简单的类型(int,string,float等)这里不再赘述。 下面讲一些开发中可能用到特殊类型 struct 类型 package main type User struct { Id int Name string Amount float64 } func main() { //声明struct var u User u.Id = 1 } 声明一个具体的user结构体类型 声明函数类型 示例1 package main import "fmt" func main() { var fn func() fn = func() { fmt.Println("anonymous func") } fn() fn = test fn() } func test() { fm...阅读全文

博文 2019-06-25 14:32:45 guyan0319

golang语言defer特性详解.md

[TOC] golang语言defer特性详解 defer语句是go语言提供的一种用于注册延迟调用的机制,它可以让函数在当前函数执行完毕后执行,是go语言中一种很有用的特性。由于它使用起来简单又方便,所以深得go语言开发者的欢迎。但是,真正想要使用好这一特性,却得对这一特性深入理解它的原理,不然很容易掉进一些奇怪的坑里还找不到原因。接下来,我们将一起来探讨defer的使用方式,使用场景及一些容易产生误解、混淆的规则。 什么是defer 首先我们来看下defer语句的官方解释 A "defer" statement invokes a function whose execution is deferred to the moment the surrounding function retu...阅读全文

博文 2019-07-12 21:32:43 木鸟飞鱼

golang 反射

反射机制是指在程序运行的时候动态地获取对象的属性后者调用对象方法的功能。golang 支持反射,原生的 json 库就是用反射机制实现。 golang 的反射有两个主要的概念: reflect.Type 和 reflect.Value 从字面上理解就是类型和值 reflect.Type reflect.Type 指的就是一个类型,可以是基本类型 int,string,也可以是自定义的结构体类型,可以通过 reflect.TypeOf() 获取对象的类型 TypeOf(i interface{}) Type // 获取任意一个对象的 Type 对象 (t *Type) NumField() int // 字段数量 (t *Type) NumMethod() int // 方法数量 (t *Ty...阅读全文

C++ 虚函数表剖析

一、概述 为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。 二、类的虚表 每个包含了虚函数的类都包含一个虚表。 我们知道,当一个类(A)继承另一个类(B)时,类A会继承类B的函数的调用权。所以如果一个基类包含了虚函数,那么其继承类也可调用这些虚函数,换句话说,一个类继承了包含虚函数的基类,那么这个类也拥有自己的虚表。 我们来看以下的代码。类A包含虚函数vfunc1,vfunc2,由于类A包含虚函数,故类A拥有一个虚表。 class A { public: virtual void vfunc1(); virtual void vfunc2(); void func1(); void func2(); pri...阅读全文

博文 2019-08-23 17:21:31 qq470603823

【golang】slice底层函数传参原理易错点

切片底层结构 切片的底层结构主要包括引用数组的地址data,切片长度len与切片容量cap。 type SliceHeader struct { Data uintptr Len int Cap int } 以切片为参数调用函数 Go语言中,如果以切片为参数调用函数时,有时候会给人一种参数采用了传引用的方式的假象:因为 在被调用函数内部可以修改传入的切片的元素。 任何可以通过函数参数修改调用参数的情形,都是因为函数参数中传人了指针参数(只有底部结构有指针地址类型,都可以改变原值,因为虽然函数拷贝了参数的地址,但地址指向一个内存,所以能修改原来值) func add(arr []int) { arr[0] = 99 } func main() { var a = make([]int, 2, ...阅读全文

博文 2020-04-23 10:32:54 dongzaidong

golang笔记之函数

函数参数传递类型1.按值传递: Go 默认使用按值传递来传递参数,也就是传递参数的副本。 2.引用传递: 如果你希望函数可以直接修改参数的值,而不是对参数的副本进行操作,你需要将参数的地址传递给函数。如果传递给函数的是一个指针,指针的值(一个地址)会被复制,但指针的值所指向的地址上的值不会被复制;我们可以通过这个指针的值来修改这个值所指向的地址上的值。tips:在函数调用时,像切片(slice)、字典(map)、接口(interface)、通道(channel)这样的引用类型都是默认使用引用传递(即使没有显式的指出指针)。几乎在任何情况下,传递指针(一个32位或者64位的值)的消耗都比传递副本来得少。defer函数关键字 defer 允许我们推迟到函数返回的前一刻才执行某个语句或函数。使用场...阅读全文

博文 2019-05-05 18:34:58 月下独酌100

GO函数

/* 格式: func function_name( [parameter list] ) [return_types]{ 函数体 } func:func声明 function_name:函数名称 [parameter list]:参数列表 return_types:返回类型,不需要返回值的,return_types可以不写。 函数体:函数体 */ package main import ( "fmt" ) func main() { //定义局部变量 var a int = 55555 var b int = 66666 var result int //调用函数 (a和b实参) result = max(a, b) //调用函数 c, d := exchange("gxm", "sail...阅读全文

博文 2020-04-29 03:33:13 赛里