Golang与各语言横向比较

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其实只是一个变量定义格式,而不是变体类型。

发布了51 篇原创文章 · 获赞 10 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/FeiBin2013/article/details/83795189
今日推荐