1. 指针 Golang VS C++
golang的指针可以说是安全版、简化版的C++指针,虽然是指针你也不会去关心其内存的释放问题,有两种方法返回一个指针。
1、make只能用来分配及初始化类型为slice,map,chan的数据;new可以分配任意类型的数据
2、new分配返回的是指针,即类型*T;make返回引用,即T;
其用法更像是定义了一个引用。
Struct的This指针与This对象
golang是不支持This关键字的,但可以通过如下定义实现类似this的功能。但主要以下两种不同的情况。
type NokiaPhone struct {
a int
}
func (nokiaPhone * NokiaPhone) call() {
nokiaPhone.a = 100
fmt.Println("I am Nokia, I can call you!")
}
func (nokiaPhone NokiaPhone) call() {
nokiaPhone.a = 100
fmt.Println("I am Nokia, I can call you!")
}
var test NokiaPhone
test.call()
fmt.Println(test.a)
线程:
Golang的goruntime是一种并发机制,并发包含并行。它是一种线程(C++/C#)与协程(Unity C#)合体。
https://blog.csdn.net/m0_37579159/article/details/79345831
以下文章定义了,线程间的通信机制,包括:Mutex、Channel
https://www.cnblogs.com/chenny7/p/4498322.html
PS:runtime包中有几个处理goroutine的函数,
函数 | 说明 |
Goexit | 退出当前执行的goroutine,但是defer函数还会继续调用 |
Gosched | 让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行 |
NumCPU | 返回 CPU 核数量 |
NumGoroutine | 返回正在执行和排队的任务总数 |
GOMAXPROCS | 用来设置可以并行计算的CPU核数的最大值,并返回之前的值 |
以上几个方法还是挺有意思的。
golang断言
断言类型的语法:x.(T),这里x表示一个接口的类型,T表示一个类型(也可为接口类型)。
https://www.cnblogs.com/susufufu/archive/2017/08/13/7353290.html
可以使用两个变量进行接收
bstr := []byte("大家好")
var testin interface{}
testin = bstr
if f, ok := testin.([]byte); ok{
fmt.Println(f)
}
fmt.Println(testin.([]byte))
注意一点,断言也可以使用一个变量接收,如果转换失败,会抛出Panic异常。
interface{}
可以做为基础对象类型,它类似C#的System.Object、Java的Object、OC的NSObject。注意与变体类型var 的区别。
后者定义之后就不会进行修改类型了,前者可以在之后赋值。
Java | TS | JavaScript | OC | Swift | C# | golang | |
变体类型 | Object | Var | var | id | var | var | var |
基础对象 | Object | Object | Object | NSObject | Any AnyObject | System.Object | interface{} |
空 | Null | Null | Null | Nil | nil | Null | nil |
引用 | 无 | 无 | 无 | TBD | TBD | 1 | * |
结构体定义 | 1 | 1 | 1 | 1 | 1 |
关于基础对象类型,GO、Java 、C#是所有类型都是其派生,包括Int等基本的类型,OC支持C的基本数据类型,比如int,float 等, 其不是从NSObject继承的,当然这里GO使用派生这个词不太准确,因为它不是直接面向对象的语言。
关于变体,Go的var其实只是一个变量定义格式,而不是变体类型。