牛客网_Go语言相关练习_判断&选择题(6)

本文共34道题目

一、判断题

此题考查编码规范。

反射最常见的使用场景是做对象的序列化(serialization,有时候也叫Marshal & Unmarshal)

例如:Go语言标准库的encoding/json、encoding/xml、encoding/gob、encoding/binary等包就大量依赖于反射功能来实现。

构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。

而golang没有相关的构造函数定义,只能通过new来创建构造函数。

Go语言中的map是无序的组合。

X字段在从结构体实例编码到JSON数据格式的时候,使用x作为名字,这可以看作是一种重命名的方式

go语言的自动内存管理机制使得只要还有一个指针引用一个变量,那这个变量就会在内存中得以保留,因此在Go语言函数内部返回指向本地变量的指针是安全的

序列化通常将类型结构传入标准库或第三方包,类型结构中没有大写的变量未导出,对第三方包不可见,无法进行任何操作,依旧是默认的零值。

指针是引用类型。主要引用对方的地址。

是目录名。

函数返回失败有3种情况:

  1. 第一次分配资源失败,直接返回,这时并没有分配成功的资源;
  2. 第一次分配资源成功,第二次分配资源失败,函数返回,第二次和第三次的资源都未成功分配,此时err不为nil,第一次分配成功的资源通过defer释放;
  3. 第一二次资源分配成功,第三次资源分配失败,函数返回,第一二次分配成功的资源通过defer释放;

如果第三次资源分配也成功了,则函数不会返回失败。

题目问的是deferDemo返回失败的情况,遇到资源分配失败才返回错误,当遇到资源分配失败时,前面已经分配成功的资源会在defer中释放。最后一次资源分配成功后没有用defer释放资源,但题目问的是函数返回失败的情况,故返回资源分配失败错误后,已经分配的资源都能释放。所以正确。

Cgo是C语言和Go语言之间的桥梁,原则上无法直接支持C++的类。Cgo不支持C++语法的根本原因是C++至今为止还没有一个二进制接口规范(ABI)。Cgo只支持C语言中值类型的数据类型,所以我们是无法直接使用C++的引用参数等特性的。

注:Cgo是调用C代码模块,静态库和动态库。

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

实践代码:

package main

import "fmt"

func main(){
    a := func(a,b int,z float64) bool{
        return a*b < int(z)
    }
    fmt.Print(a(2,3,3))  //false
}

匿名函数:由一个不带函数名的函数声明和函数体组成,它可以直接赋值给一个变量或直接执行

二、选择题

如果有多个defer表达式,调用顺序类似于栈,越后面的defer表达式越先被调用。所以先执行fmt再执行if判断,答案依次输出“1”和“3”。

Add函数带入的是b而不是*b,所以只能在AC中选,但是i.(Integer)经过类型断言以后就是Integer类型了,无法自动转成*Integer,所以只能选A了。如果将题目改成sum := a.Add(b)则可以选AC。

不定参以“值”的切片类型传入,无参数传入则为空。 D正确。

函数的定义:func Append(s Value, x ...Value) Value

函数不定参的解释:

If f is variadic with a final parameter p of type ...T, then within f the type of p is equivalent to type []T. If f is invoked with no actual arguments for p, the value passed to p is nil. Otherwise, the value passed is a new slice of type []T with a new underlying array whose successive elements are the actual arguments, which all must be assignable to T. The length and capacity of the slice is therefore the number of arguments bound to p and may differ for each call site.

Given the function and calls

func Greeting(prefix string, who ...string)

Greeting("nobody")

Greeting("hello:", "Joe", "Anna", "Eileen")

within Greeting, who will have the value nil in the first call, and []string{"Joe", "Anna", "Eileen"} in the second.

If the final argument is assignable to a slice type []T, it may be passed unchanged as the value for a ...T parameter if the argument is followed by .... In this case no new slice is created.

Given the slice s and call

s := []string{"James", "Jasmine"}

Greeting("goodbye:", s...)

within Greeting, who will have the same value as s with the same underlying array.

def是python定义函数的关键字,class是类型。

ABC,A为最完整的写法,指明了变量名,类型,初始值;B是简写法,没有指定变量类型,不过go提供了类型推断,其会根据初始值推断类型;C是快速模式,通过":="快速创建一个变量。

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

在影响软件系统稳定性的因素里,我们最担心的一个问题是内存泄漏,随着系统的运行,系统消耗的内存越来越多,直到最后整个操作系统越来越慢,甚至还会导致系统崩溃。在Go语言里,我们检测内存泄漏主要依靠的是go里面的pprof包,除此之外,我们还可以使用浏览器来查看系统的实时内存信息(包括CPU、goroutine等的信息。

实现接口时,不需要提前导入,都是隐式默认的。

  1. init函数可以在任何包中有0个或1个或多个
  2. 首先初始化导入包的变量和常量,然后执行init函数,最后初始化本包的变量和常量,然后是init函数,最后是main函数;
  3. main函数只能在main包中有且只有一个,main包中也可以有0或1或多个init函数;
  4. init函数和main函数都不能被显示调用;

Go语言中只有for循环。for后面的语句中不能有逗号分割的语句,各个语句必须都是平等的,使用分号分割。for后面可以有无数多个分号。

go语言中的++、--操作符都是后置操作符,必须跟在操作数后面,并且它们没有返回值,所以它们不能用于表达式。

D中add会把数组中元素转成int值变成多个参数。

一个类实现了一个接口中的所有方法,那么它就实现了这个类。可以用这个类的对象来初始化一个接口。通过接口可以实现多态,类似C++虚函数重载。

Make只用来创建slice,map,channel,其中map使用前必须初始化。append可直接动态扩容slice,而map不行。

map在使用前必须初始化。
 
var m map[string]int = make(map[string]int)
m["one"] = 1
//这样可以;
 
var m map[string]int = map[string]int{"two", 2}
m["one"] = 1
//这样也可以;
 
var m map[string]int
m["one"] = 1
//这样就不行。

main函数和init函数都没有参数和返回值的定义。

递归检测:go tool vet package1 package2。因此——go tool vet 才可以递归

Golang中大多数数据类型都可以转化为有效的JSON文本,除了channel、complex、函数等。

Go语言中的引用类型只有五个:切片    映射    函数    方法    通道。

nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果将nil赋值给其他变量的时候将会引发panic。 

三、参考资料

GoConvey_初步认识

golang语言反射三定律

匿名函数_Go语言圣经

GoConvey框架使用指南

go vet与go tool vet_极客学院

如果你用Go,不要忘了vet

vet 命令

go vet 学习笔记

Golang 序列化方式及对比

四、总结

本次练习把牛客网最后的34道Go语言练习题全部搞完了。涉及构造函数、GoConvey框架、反射、vet指令、序列化、main函数概念、错误设计、init函数、add函数、接口、匿名函数、Cgo、defer表达式等。

不断迭代,不断更新,不断尝试并不断进步。

后期将着重学习Go语言的框架和项目实践学习。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专注 Java 基础分享

全面理解java异常机制

      在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大牛,你也不可避免出错,所以java为我们提供了异常机制。本文将会从以下几个方面...

2787
来自专栏PHP实战技术

你应该这个姿势学习PHP(1)

  应用场景:能防止sql的注入(当然并不完全是可以,我们可以使用pdo进行预处理然后方式sql的注入,安全不能只靠一种方式防止事情的发生)

52717
来自专栏C语言及其他语言

实例说明

上一节,我们大致总揽了一个简单C程序的框架,程序如下: #include<stdio.h> /*引入头文件*/ int main(void) /*一个简单的C程...

2868
来自专栏python学习路

数据结构与算法(一)

算法的概念 算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。一般地,当算法在处理信息时,会从输入设备或数据...

4375
来自专栏JAVA高级架构

Java面试2018常考题目汇总(一)

一、JAVA基础篇-概念 1.简述你所知道的Linux: Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统...

35210
来自专栏java一日一条

Java transient关键字使用总结

哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关...

751
来自专栏cloudskyme

设计模式(8)-状态模式(关注状态之间的变化)

状态模式(State Pattern)是设计模式的一种,属于行为模式。 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这...

3677
来自专栏Java技术分享

Java8的十大新特性你了解多少呢?

今天,我们先来复习一下2014年发布的Java 8的十大新特性。 Java 8可谓是自Java 5以来最具革命性的版本了,她在语言、编译器、类库、开发工具以及J...

2178
来自专栏老九学堂

【超全】C语言初学者必须掌握的关键字!

其实小伙伴在写代码的时候,关键字还是用的比较多的,老九主要就平常中用到的常用关键字进行总结,便于小伙伴们更全面的理解其在代码中的意图。 C语言关键字总结 sta...

3776
来自专栏问天丶天问

Java 8 特性

1943

扫码关注云+社区

领取腾讯云代金券