本文共34道题目html
此题考查编码规范。node
反射最多见的使用场景是作对象的序列化(serialization,有时候也叫Marshal & Unmarshal)。python
例如:Go语言标准库的encoding/json、encoding/xml、encoding/gob、encoding/binary等包就大量依赖于反射功能来实现。golang
构造函数 ,是一种特殊的方法。主要用来在建立对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一块儿使用在建立对象的语句中。特别的一个类能够有多个构造函数 ,可根据其参数个数的不一样或参数类型的不一样来区分它们 即构造函数的重载。json
而golang没有相关的构造函数定义,只能经过new来建立构造函数。数组
Go语言中的map是无序的组合。浏览器
X字段在从结构体实例编码到JSON数据格式的时候,使用x做为名字,这能够看做是一种重命名的方式。安全
go语言的自动内存管理机制使得只要还有一个指针引用一个变量,那这个变量就会在内存中得以保留,所以在Go语言函数内部返回指向本地变量的指针是安全的。app
序列化一般将类型结构传入标准库或第三方包,类型结构中没有大写的变量未导出,对第三方包不可见,没法进行任何操做,依旧是默认的零值。框架
指针是引用类型。主要引用对方的地址。
是目录名。
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。
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是快速模式,经过":="快速建立一个变量。
实现接口时,不须要提早导入,都是隐式默认的。
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 才能够递归。
本次练习把牛客网最后的34道Go语言练习题所有搞完了。涉及构造函数、GoConvey框架、反射、vet指令、序列化、main函数概念、错误设计、init函数、add函数、接口、匿名函数、Cgo、defer表达式等。
不断迭代,不断更新,不断尝试并不断进步。
后期将着重学习Go语言的框架和项目实践学习。