Go cgo 调用C++的DLL,但是DLL返回的是一个对象指针,能否用Go调用这个指针对象的方法?求大神指点

定义一个包内全局字符串变量,下面语法正确的是()

通过指针变量P访问其成员变量name,下面语法正确的是()

关于接口和类的说法,下面说法正确的是()

A. 一个类只需要实现了接口要求的所有函数,我们就说这个类实现了所有接口
B. 实现类的时候,只需要关心自己应该提供哪些方法,不用再纠结接口需要拆得多细才合理
C. 类实现接口时,需要导入接口所在的包
D. 接口由使用方法按自身需求来定义,使用方无需关心是否有其他模块定义过类似的接口

关于字符串连接,下面语法正确的是()

关于协程,下面说法正确的是()

A. 协程和线程都可以实现程序的并发执行
B. 线程比协程更轻量级
C. 协程不存在死锁问题
D. 通过channel来进行协程间的通信

关于init函数,下面说法正确的是()

A. 一个包中,可以包含多个init函数
B. 程序编译时,先执行导入包的init函数,在执行本包内的init函数
D. init函数可以被其他函数调用

关于循环语句,下面说法正确的有()

B. 关键字for的基本使用方法与C/C++中没有任何差异
C. for循环支持continue和break来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个环节
D. for循环不支持以逗号为间隔的多个赋值语句,必须使用平行赋值的方式来初始化多个变量

关于类型转化,下面语法正确的是()

关于局部变量的初始化,下面正确的使用方式是()

关于const常量定义,下面正确的使用方式是()

关于布尔变量b的赋值,下面错误的用法是()

下面的程序的运行结果是()

关于switch语句,下面说法正确的有()

A. 条件表达式必须为常量或者整数
B. 单个case中,可以出现多个结果选项
D. 只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case

golang中没有隐藏的this指针,这句话的含义是()

A. 方法施加的对象显式传递,没有被藏起来
B. golang沿袭了传统面向对象编程中的诸多概念,比如继承、虚函数和构造函数
C. golang的面向对象表达更直观,对于面向过程只是换了一种语法形式来表达
D. 方法施加的对象不需要非得是指针,也不用非得叫this

golang中的引用类型包括()

golang中的指针运算包括()

A. 可以对指针进行自增或自减运算
B. 可以通过“&”取指针的地址
C. 可以通过“*”取指针指向的数据
D. 可以对指针进行下标运算

关于main函数(可执行程序的起点),下面说法正确的是()

B. main函数不能定义返回值
D.main函数中可以使用flag包来获取和解析命令行参数

关于整型切片的初始化,下面正确的是()

从切片中删除一个元素,下面的算法实现正确的是()

对于局部变量类型切片X的赋值,下面定义正确的是()

关于变量的自增和自减操作,下面语句正确的是()

关于函数声明,下面语法错误的是()

如果Add函数的调用代码为:

则Add函数定义正确的是()

如果Add函数的调用代码为:

则Add函数定义正确的是()

关于GoMock,下面说法正确的是()

关于接口,下面说法正确的是()

A. 只要两个接口拥有相同的方法列表(次序不同不要紧),那么它们就是等价的,可以互相赋值
B. 如果接口A的方法列表是接口B的方法列表的子集,那么接口B可以赋值给接口A
C. 接口查询是否成功,要在运行期才能够确定
D. 接口赋值是否可行,要在运行期才能够确定

关于channel,下面语法正确的是()

关于同步锁,下面说法正确的是()

B. RWMutex在读锁占用的情况下,会阻止写,但不阻止读
C. RWMutex在写锁占用情况下,会阻止任何其他goroutine(无论读和写)进来,整个锁相当于由该goroutine独占

golang中大多数数据类型都可以转化为有效的JSON文本,下面几种类型除外()

关于go vendor,下面说法正确的是()

A. 基本思想是将引用的外部包的源代码放在当前工程的vendor目录下面
B. 编译go代码会优先从vendor目录先寻找依赖包
C. 可以指定引用某个特定版本的外部包
D. 有了vendor目录后,打包当前的工程代码到其他机器的¥GOPATH/src下都可以通过编译

flag是bool型变量,下面if表达式符合编码规范的是()

value是整型变量,下面if表达式符合编码规范的是()

关于函数返回值的错误设计,下面说法正确的是()

A. 如果失败原因只有一个,则返回bool
B. 如果失败原因超过一个,则返回error
C. 如果没有失败原因,则不返回bool或error
D. 如果重试几次可以避免失败,则不要立即返回bool或error

关于异常设计,下面说法正确的是()

A. 在程序开发阶段,坚持速错,让程序异常崩溃
B. 在程序部署后,应恢复异常避免程序终止
C. 一切皆错误,不用进行异常设计
D. 对于不应该出现的分支,使用异常处理

关于slice或map操作,下面正确的是()

关于channel的特性,下面说法正确的是()

D. 从一个已经关闭的channel接收数据,如果缓冲区中为空,则返回一个零值

关于无缓冲和有缓冲的channel,下面说法正确的是()

关于异常的触发,下面说法正确的是()

关于cap函数的适用类型,下面说法正确的是()

关于beego框架,下面说法正确的是()

B. beego可以通过注释路由、正则路由等多种方式完成url路由注入
C. 可以使用bee new工具生成空工程,然后使用bee run命令自动热编译
D. beego框架只提供了对url路由的处理,而对于MVC架构中的数据库部分未提供框架支持

关于goconvey,下面说法正确的是()

B. goconvey能够自动监控文件修改并启动测试,并可以将测试结果实时输出到web界面
C. goconvey提供了丰富的断言简化测试用例的编写

关于go vet,下面说法正确的是()

关于map,下面说法正确的是()

B. 在函数调用中传递map,则子函数中对map元素的增加不会导致父函数中map的修改
C. 在函数调用中传递map,则子函数中对map元素的修改不会导致父函数中map的修改
D. 不能使用内置函数delete删除map的元素

关于GoStub,下面说法正确的是()

C. GoStub可以对类的成员方法打桩
D. GoStub可以打动态桩,比如对一个函数打桩后,多次调用该函数会有不同的行为

关于select机制,下面说法正确的是()

B. select机制最大的一条限制就是每个case语句里必须是一个IO操作
D. select关键字的用法与switch语句非常类似,后面要带判断条件

关于内存泄漏,下面说法正确的是()

A. golang有自动垃圾回收,不存在内存泄漏
C. 内存泄漏可以再编译阶段发现
D. 应定期使用浏览器来查看系统的实时内存信息,及时发现内存泄漏问题

go test要求测试函数的前缀必须命名为 Test

下面的程序的运行结果是

下面的程序的运行结果是

下面的程序的运行结果是

下面的程序的运行结果是

下面的程序的运行结果是

下面的程序的运行结果是

下面的程序的运行结果是

数组是一个值类型(T)

使用map不需要引入任何库(T)

内置函数delete可以删除数组切片内的元素(F)

下面关于文件操作的代码可能触发异常(T)

Golang不支持自动垃圾回收(F)

Golang支持反射,反射最常见的使用场景是做对象的序列化(T)

下面代码中两个斜点之间的代码,比如json:“x”,作用是X字段在从结构体实例编码到JSON数据格式的时候,使用x作为名字,这可以看作是一种重命名的方式(T)

通过成员变量或函数首字母的大小写来决定其作用域(T)

对于常量定义zero(const zero = 0.0),zero是浮点型常量(F)——go的常亮通常是无类型的,但是可以参与一些“有类型”的计算

对于变量x的取反操作是~x(F)

下面的程序的运行结果是xello(F)

下面代码中的指针p为野指针,因为返回的栈内存在函数结束时会被释放(F)

匿名函数可以直接赋值给一个变量或者直接执行(T)

如果调用方调用了一个具有多返回值的方法,但是却不想关心其中的某个返回值,可以简单地用一个下划线"_"来跳过这个返回值,该下划线对应的变量叫做匿名变量(T)

在函数的多返回值中,如果有error或bool类型,则一般会放在最后一个(T)

错误是业务过程的一部分,而异常不是(T)

函数执行时,如果由于panic导致了异常,则延迟函数不会执行(F)

当程序运行时,如果遇到引用空指针、下标越界或显式调用panic函数等情况,则先触发panic函数的执行,然后调用延迟函数。调用者继续传递panic,因此该过程一直在调用栈中重复发生:函数停止执行,调用延迟执行函数。如果一路在延迟函数中没有recover函数的调用,则会到达该协程的起点,该协程结束,然后终止其他所有协程,其他协程的终止过程也是重复发生:函数停止执行,调用延迟执行函数(F)

同级文件的包名不允许有多个(T)

可以给任意类型添加相应的方法(F)

golang虽然没有显式的提供继承语法,但是通过匿名组合实现了继承(T)

使用for range迭代map时每次迭代的顺序可能不一样,因为map的迭代是随机的(T)

switch后面可以不跟表达式(T)

结构体在序列化时非导出变量(以小写字母开头的变量名)不会被encode,因此在decode时这些非导出变量的值为其类型的零值(T)

golang中没有构造函数的概念,对象的创建通常交由一个全局的创建函数来完成,以NewXXX来命名(T)

channel本身必然是同时支持读写的,所以不存在单向channel(F)

import后面的最后一个元素是包名(F)

写出下面代码的输出内容

考点:defer先后顺序
defer是后进先出的
panic需要等到defer结束后才会向上传递。出现panic恐慌时候,会先按照defer的后入先出的顺序执行,最后才执行panic。

以下代码有什么问题,说明原因

这样的写法初学者经常会遇到的,很危险!与Java的foreach一样,都是使用副本的方式。所以 m[stu.Name]=&stu实际上一致指向同一个指针,最终该指针的值为遍历的最后一个struct的值拷贝。就像想修改切片元素的属性:

也是不可行的。大家可以试试打印出来:

下面代码会输出什么,并说明原因

考点:go执行的随机性和闭包
谁也不知道执行后打印的顺序是怎么样的,所以只能说是随机数字。但是A:均为输出10,B:从0~9输出(顺序不定)。第一个go func中i是外部for的一个变量,地址不变化。遍历完成后,最终i=10.。故go func执行时,i的值始终是10。
第二个go func中i是函数参数,与外部for中的i完全是两个变量。尾部(i)将发生值拷贝,go func内部指向值拷贝地址。

解答:这是Golang的组合模式,可以实现OOP的继承,被组合的类型People所包含的方法虽然升级成了外部类型Teacher这个组合类型的方法(一定要是匿名字段),但它们的方法(ShowA())调用时接受者并没有发生变化。此时People类型并不知道他们会变什么类型组合,当然也就无法调用方法时去使用未知的组合者Teacher类型的功能。

下面代码会触发异常吗?请详细说明

select会随机选择一个可用通用做收发操作。所以代码是有可能触发异常,也有可能不会。单个chan如果无缓冲时,将会阻塞。但结合select可以在多个chan间等待执行。有三点原则:
当如果同一时间有多个case均能return则伪随机方式抽取任意一个执行。

make初始化是有默认值的,此处默认值为0

下面的迭代会有什么问题?

看到这道题目,我也在猜想出题者的意图在哪里。chan?sync.RWMutex?go?chan缓存池?迭代?所以只能再读一次题目,就从迭代入手看看,既然是迭代就会要求ste.s全部可以遍历一次。但是chan是为缓存的,那就代表写入一次就会阻塞。我们把代码恢复为可以运行的方式,看看效果

以下代码能编译过去吗?为什么?

考点:golang的方法集
编译不通过!做错了!?说明你对golang的方法集还有一些疑问。一句话:golang的方法集仅仅影响接口实现和方法表达式转化,与通过实例或者指针调用方法无关。

以下代码打印出来什么内容,说出为什么


可以看出iface比eface中间多了一层itab结构。itab存储_type信息和[]fun方法集,从上面的结构我们就可得出,因为data指向了nil并不代表interface是nil,所以返回值并不为空,这里的fun(方法集)定义了接口的接收规则,在编译过程中需要验证是否实现接口

是否可以编译通过?如果通过,输出什么?

在函数有多个返回值时,只要有一个返回值有指定命名,其他的也必须有命名。如果返回值有多个,返回值必须加上括号;如果只有一个返回值并且有命名也需要加上括号;此函数第一个返回值有sum名称,第二个未命名,所以错误。

是否可以编译通过?如果通过,输出什么?

考点:defer和函数返回值
需要明确一点是defer需要在函数结束前执行。函数返回值名字会在函数起始处被初始化为对应类型的零值并且作用域为整个函数。DeferFunc1有函数返回值t作用域为整个函数,在return之前defer会被执行,所以t被修改了,返回4;DeferFunc2函数中t的作用域为函数,返回1;DeferFunc3,返回3

是否可以编译通过?如果通过,输出什么?

是否可以编译通过?如果通过,输出什么?

append会把第二个参数进行切片,需要在s2后面加上“…”,该程序才能编译通过

是否可以编译通过?如果通过,输出什么?

进行结构体比较时,只有相同类型的结构体才可以比较,结构体是否相同不但与属性类型个数有关,还与属性顺序相关

sn3与sn1就不是相同的结构体了,不能比较。还有一点需要注意的是结构体是相同的,但是结构体属性中有不可以比较的类型,如map,slice。如果该结构属性都是可以比较的,那么就可以使用“==”进行比较操作。

是否可以编译通过?如果通过,输出什么?

是否可以编译通过?如果通过,输出什么?

是否可以编译通过?如果通过,会输出什么?

编译执行下面代码会出现什么?

变量简短模式限制:定义变量同时显式初始化;不能提供数据类型;只能在函数内部使用

常量不同于变量的在运行期分配内存,常量通常会被编译器在预处理阶段直接展开,作为指令数据使用

编译执行下面代码会出现什么

goto不能直接跳转到其他函数或者内层代码

编译执行下面代码会出现什么

基于一个类型创建一个新类型,称之为defintion;基于一个类型创建一个别名,称之为alias。Myint1为称之defintion,虽然底层类型为int类型,但是不能直接赋值,需要强转;Myint2称之为alias,可以直接赋值

编译执行下面代码会出现什么?

因为MyUser2完全等价于User,所以具有其所有的方法,并且其中一个新增了方法,另一个也会有。但是i1.m2()是不能执行的,因为MyUser1没有定义该方法。

编译执行下面代码会出现什么

不能正常编译,异常:ambiguous selector m1。结果不限于方法,字段也一样;也不限于type alias,type defintion也是一样的,只要有重复的方法、字段,就会有这种提示,因为不知道该选择哪个。改为:

type alias的定义,本质上是一样的类型,只是起了一个别名,源类型怎么用,别名类型也怎么用,保留源类型的所有方法、字段等

编译执行下面代码会出现什么

因为if语句块内的err变量会遮罩函数作用域内的err变量,结果:

编译执行下面代码会出现什么

for循环复用局部变量i,每一次放入匿名函数的应用都是想一个变量。结果

如果想不一样可以改为:

编译执行下面代码会出现什么

考点:闭包引用相同变量*

编译执行下面代码会出现什么

考点:panic仅有最后一个可以被recover捕获

1)swift,貌似官网的推荐

我使用后者,用起来比较爽,上代码

  1. 首先Lua执行的每一段代码都称之为“程序块”,一个程序块也就是一连串的语句或命令,例如一个源码文件或一行代码.Lua语句之间并不需要分隔符,如代码中的换行就不起任何作用,当然为了养成编码习惯当两条或者 ...

  2. Java虽然利用JVM,让程序员可以放心大胆的使用,可是仍然会出现内存泄露等问题.世上没有绝对的银弹,因此也不能完全把所有的任务都交给JVM,了解Java中的初始化与垃圾回收还是必不可少的知识. 关于 ...

  3. 移动端HTML5性能优化 [导读] 得益于智能手机的普及和各行各业互联网+的运动,移动端的市场占比疯狂增长. 2016年1月发布的2015年电商数据显示,2015年中国移动端网购交易额同比暴涨123 ...

  4. 这段时间做一个项目:使用 thinkphp 做了一个自动验证,但是发现如果新增的时候,是能够进行自动验证的,但是在修改的修改的时候,会发现自动验证会失效. 验证的时候,模型是这样写的: protect ...

  5. 题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最 ...

  6. (1)指针常量,将指针的指向当成常量.即指针变量的值只能在定义的时候初始化,定义后不能修改,也就是说不能改变指针变量的指向.但是不影响所指对象的访问特征.其定义形式为: 类型 * const 指针 / ...

我要回帖

更多关于 虚函数的调用 的文章

 

随机推荐