void foo() {
char* p = new char[128]; ... // 对p指向的内存块进行赋值
func1(p); // 使用内存指针
delete[] p;
}
////////////////////////////////////
2更丰富的内置类型
布尔类型:bool
整型:int8(等效byte)、 int16 、int(随系统位变化) 、uint(无符号整型)、uintptr(同指针)等
浮点类型:float32、float64
复数类型:complex64、complex128
字符串:string
字符类型:rune
错误类型:error
此外还还支持复合类型:
指针(pointer)
数组(array)
切片(slice 通常指数组切片类似python里面的切片)
字典(map)
通道(chan)
结构体(struct)
接口(interface)
///////////////////////
3 函数多返回值
demo:
func getName()(firstName, middleName, lastName, nickName string){
firstName = "May"
middleName = "M"
lastName = "Chen"
nickName = "Babe"
return
}
调用
fn, mn, ln, nn := getName()
如果只需要nickName则
_, _, _, nn := getName()
注:并不是每一个返回值都必须赋值,没有被明确赋值的返回值将保持默认的空值。
/////////////////////////////
4 错误处理:go语言引入了defer 、panic、recover来处理错误(摒弃了一层一层的try-catch)
////////////////////////
5 匿名函数和闭包
go中所有函数也是值类型,它支持常规的匿名函数和闭包,可以随意对匿名函数变量进行传递和调用
demo
f := func(x, y int) int {
return x + y
}
///////////////////////////////
6接口和类型
C++中接口和类型的关系确定
demo:
// 抽象接口 interface IFly { virtual void Fly()=0; };
// 实现类
class Bird : public IFly {
public:
Bird() {}
virtual ~Bird() {}
public:
void Fly() { // 以鸟的方式飞行 }
};
void main() {
IFly* pFly = new Bird();
pFly->Fly();
delete pFly;
}
显然C++,在实现一个接口之前必须先定义接口并且将类型和接口紧密绑定(修改接口会影响到所有实现了改接口的类型)
然而go
type Bird struct {
...
}
func (b *Bird) Fly() {
// 以鸟的方式飞行
}
我们在实现Bird类型是完全没有任何IFly的信息。我们可以另外一个地方定义IFly接口:
type IFly interface {
Fly()
}
//这两者目前看起来完全没有关系,现在看看我们如何使用它们:
func main() {
var fly IFly = new(Bird)
fly.Fly()
}
////////////////////////////////////////
7并发编程
Go语言引入了goroutine概念,它使得并发编程变得非常简单。通过使用goroutine而不是裸用 操作系统的并发机制,以及使用消息传递来共享内存而不是使用共享内存来通信,Go语言让并 发编程变得更加轻盈和安全。
////////////////////////////////////////
8反射
通过反射,你可以获取对 象类型的详细信息,并可动态操作对象。反射是把双刃剑,功能强大但代码可读性并不理想。若 非必要,并不推荐使用反射。
反射常见的使用场景是做对象的序列化(serialization,有时候也叫Marshal & Unmarshal)。 例如,Go语言标准库的encoding/json、encoding/xml、encoding/gob、encoding/binary等包就大量 依赖于反射功能来实现。
demo:可以利用反射功能列出某个类型中所有成员变量的值
package main
import (
"fmt"
"reflect"
)
type Bird struct {
Name string
LifeExpectance int
}
func (b *Bird) Fly() {
fmt.Println("I am flying...")
}
func main() {
sparrow := &Bird{"Sparrow", 3}
s := reflect.ValueOf(sparrow).Elem()
typeOfT := s.Type()
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
fmt.Printf("%d: %s %s = %v\n", i, typeOfT.Field(i).Name, f.Type(), f.Interface())
}
}
该程序的输出结果为:
0: Name string = Sparrow
1: LifeExpectance int = 3
/////////////////////////////////
9语言交互性
go语言可以重用现有c模块,其功能被命名为cgo与java中的jni有所不同
demo go调用c语言标准库中的puts函数
package main
/* #include */
import "C"
import "unsafe"
func main() {
cstr := C.CString("Hello, world")
C.puts(cstr)
C.free(unsafe.Pointer(cstr))
}