龙空技术网

PHP与GO的区别

程序员的后半生 1082

前言:

现在大家对“php举例”大概比较关切,朋友们都想要了解一些“php举例”的相关文章。那么小编也在网摘上搜集了一些对于“php举例””的相关知识,希望姐妹们能喜欢,兄弟们一起来学习一下吧!

解析型语言与编译型语言不管从性能上,还是从语法上有着较大的差异。

我刚开始从PHP过渡到GO时,无论从语法上还是编程思想上都感觉好别扭,PHP是面向对象的编程思想,而GO更像是面向包的设计思想,所以刚写GO时会经常以PHP编程思维去写代码逻辑,考虑继承考虑多态,其它的下次讲解,今天我举例了几项常见的PHP与GO语法上差异,有兴趣的朋友可以了解一下。

一、变量定义与赋值

这里可以明显突出脚本语言与编译语言的语法差异

PHP:弱类型变量,同一个变量可以随意赋值任何数据类型

$data = 'jack';$data = 15;$data = ['name'=>'jack','age'=>15];

GO:强类型变量,变量需预定义,不能随意赋值不同数据类型

var data string = "jack"//预定义变量类型并赋值data = "ben"data = 15	//报错:预定义字符串类型,不能再赋值为整型

二、函数定义与回传

Go多值回传比较方便,PHP单值回传某些情况还需判断元素isset($data['nickname'])

PHP:函数只允许单个值回传

function getUser(){    return [        'nickname' => 'Jack',        'city' => 'beijing',        'age' => 15,    ];}$data = getUser();echo $data['nickname'],$data['city'],$data['age'];

GO:函数可回传多个值,且传参与回参需定义数据类型

func main() {	nickname,city,_ := getUser()// ’_‘ 选择忽略 忽略	fmt.Println(nickname,city)}func getUser() (nickname string,city string,age int)  {	return "jack","beijing",15}

三、阵列(数组)

PHP对数组处理更方便更强大,GO定义多维数组需考虑类型,显得有点繁琐

PHP:定义一个数组变量,无需考虑元素类型任意的多层嵌入赋值

$arr1 = [1,2,3,4,5];$arr2 = ['a','b','c','d'];$arr3 = [    'year' => '2022',    'month' => '03',    'day' => '16',];$arr4 = [    'jack' => [        'city' => '广州',        'age' => 23    ],    'ben' => [        'city' => '深圳',        'age' => 26    ],];

GO:需区分数组(定长)、切片、映射、接口

//数组方式:必须定义长度arr1 := [5]int{1,2,3,4,5}//切片方式:无需定义长度,自由扩展arr2 := []string{"a","b","c","d"}//映射方式:键与值匹配赋值arr3 := map[string]string{	"year":"2022",	"month":"03",	"day":"16",}//任意类型方式:好长arr4 := map[string]interface{}{	"jack":map[string]interface{}{		"city":"23",		"age":25,	},	"ben":map[string]interface{}{		"city":"深圳",		"age":25,	},}

四、抛出异常机制

GO设计初衷就不建议用try catch这种方式捕捉异常,在编译前就应该检查错误,很多人吐槽过这点。

PHP:try和catch可以友好的捕捉代码不规范的异常错误处理

try {    if (1 == 1){        throw new \Exception("抛出异常");    }}catch (\Exception $e){    echo "捕捉异常:".$e->getMessage();}

GO:与其它语言不同,panic如果不用recover()会使整个主程序退出不可用

defer func() {   if r := recover(); r != nil {      fmt.Println("捕捉异常",r.(string))   }}()if 1 == 1 {   panic("抛出异常")}

五、判断元素是否存在

PHP比较精简,内置函数判断,GO判断显得有点不太人性化

PHP:简单用in_array与isset即可

$arr1 = ['a','b','c'];if (in_array('a',$arr1)){    echo "存在";}$arr2 = ['name'=>'jack','city'=>'深圳'];if (isset($arr2['name'])){    echo "存在";}

GO:切片类型必须用遍历判断,Map映射需回传值判断

arr1 := []string{"a","b","c"}for _,val := range arr1{   if val == "a" {      fmt.Println("存在")     break   }}arr2 := map[string]string{   "name":"jack",   "city":"深圳",}if _,ok:= arr2["name"];ok == true {   fmt.Println("存在")}

六、继承

GO设计思想就不是面向对象的编程,所以没有太多继承与多态,编写思想上需要改变。

PHP:extends关键词继承父类的方法和属性

class person{    protected $action = "";    protected function run(){        return "I can run".$this->action;    }}class man extends person{    public function index(){        $this->action = "swimming";        return $this->run();    }}

GO:struct结构体定义成员属性变量,从而实现继承

type Person struct {	Action string}func (p *Person) Run() string{	return "I can run and " + p.Action}type Man struct {	Person}func (m *Man) Index() {	m.Action = "swimming"	m.Run()}

总结:语法上各有各的优势,下次从性能上给大家讲解一下区别。

#程序员##PHP##Go语言#

标签: #php举例