详解Go与PHP的语法对比


Posted in PHP onMay 29, 2021

概述

Go 是由 Google 设计的一门静态类型的编译型语言。它有点类似于 C,但是它包含了更多的优点,比如垃圾回收、内存安全、结构类型和并发性。它的并发机制使多核和网络机器能够发挥最大的作用。这是 GoLang 的最佳卖点之一。此外,Go 速度快,表现力强,干净且高效。这也是 Go 如此吸引开发者学习的原因。

PHP 是一种动态类型语言,它使新手更容易编写代码。现在的问题是,PHP 开发人员能否从动态类型语言切换到像 Go 这样的静态类型语言?为了找到答案,让我们对比一下 Go 和 PHP 之间的语法差异。

数据类型

Go 同时支持有符号和无符号整数,而 PHP 只支持有符号整数。

另一个主要区别是数组。Go 对 array 和 map 有单独的类型,而 PHP 数组实际上是有序的 map。

Go 与 PHP 相比没有对象。但是,Go 有一个类似于object的struct类型。

PHP 数据类型:

boolean

string

integer // Signed integer, PHP does not support unsigned integers.

float (also known as "floats", "doubles", or "real numbers")

array

object

null

resource

Go 数据类型:

string

bool

int  int8  int16  int32  int64 // Signed integer

uint uint8 uint16 uint32 uint64 uintptr // Unsigned integers

byte // alias for uint8

rune // alias for int32

float32 float64

complex64 complex128

array

slices

map

struct

变量

Go 使用var声明全局变量和函数变量。但是,它也支持带有初始化程序的简写语法,但只能在函数内部使用。另一方面,PHP 仅支持带有初始化程序的变量声明。

// 变量声明

// Go               // PHP

var i int           $i = 0      // integer

var f float64       $f = 0.0    // float

var b bool          $b = false  // boolean

var s string        $s = ""     // string

var a [2]string     $a = []     // array

// 简短的变量声明

// Go                      // PHP

i := 0                     $i = 0      // integer

f := 0.0                   $f = 0.0    // float

b := false                 $b = false  // boolean

s := ""                    $s = ""     // string

a := [1]string{"hello"}    $a = []     // array

类型转换

// Go

i := 42             // Signed integer

f := float64(i)     // Float

u := uint(f)        // Unsigned integer

// PHP

$i = 1;

$f = (float) $i;    // 1.0

$b = (bool) $f      // true

$s = (string) $b    // "1"

数组

// Go

var a [2]string

a[0] = "Hello"

a[1] = "World"

// OR

a := [2]string{"hello", "world"}

// PHP

$a = [

    "hello",

    "world"

];

Maps

// Go

m := map[string]string{

    "first_name": "Foo",

    "last_name": "Bar",

}

// PHP

$m = [

    "first_name" => "Foo",

    "last_name" => "Bar"

];

对象类型

Go 不支持对象。但是,您可以使用structs实现object之类的语法。

// Go
package main
import "fmt"
type Person struct {
    Name string
    Address string
}
func main() {
    person := Person{"Foo bar", "Sydney, Australia"}
    fmt.Println(person.Name)
}
// PHP
$person = new stdClass;
$person->Name = "Foo bar";
$person->Address = "Sydney, Australia";
echo $person->Name;
// 或使用类型转换
$person = (object) [
    'Name' => "Foo bar",
    'Address' => "Sydney, Australia"
];
echo $person->Name;

函数

Go 和 PHP 函数之间的主要区别是; Go 函数可以返回任意数量的结果,而 PHP 函数只能返回一个结果。但是,PHP 可以通过返回数组来模拟相同的功能。

// Go
package main
import "fmt"
func fullname(firstName string, lastName string) (string) {
    return firstName + " " + lastName
}
func main() {
    name := fullname("Foo", "Bar")
    fmt.Println(name)
}
// 返回多个结果
// Go
package main
import "fmt"
func swap(x, y string) (string, string) {
    return y, x
}
func main() {
    a, b := swap("hello", "world")
    fmt.Println(a, b)
}
// PHP
function fullname(string $firstName, string $lastName) : string {
    return $firstName . " " . $lastName;
}
$name = fullname("Foo", "Bar");
echo $name;
// PHP
// 返回一个数组以获得多个结果
function swap(string $x, string $y): array {
    return [$y, $x];
}
[$a, $b] = swap('hello', 'world');
echo $a, $b;

控制语句

If-Else

// Go
package main
import (
    "fmt"
)
func compare(a int, b int) {
    if a > b {
        fmt.Println("a is bigger than b")
    } else {
        fmt.Println("a is NOT greater than b")
    }
}
func main() {
    compare(12, 10);
}
// PHP
function compare(int $a, int $b) {
    if ($a > $b) {
        echo "a is bigger than b";
    } else {
        echo "a is NOT greater than b";
    }
}
compare(12, 10);

Switch

根据 Golang 官方教程文档:

Go 的 switch 与 C,C+,Java,JavaScript 和 PHP 中的类似,除了 Go 只运行选中的 case,而不是随后的所有 case。 实际上,break语句在这些语言中的每个 case 后都是必需的,而在 Go 中则是自动补充的。另一个重要的区别是 Go 的 switch cases 不需要是常量,并且涉及的值也不必是整数。

// Go
package main
import (
    "fmt"
    "runtime"
)
func main() {
    fmt.Print("Go runs on ")

    os := runtime.GOOS;

    switch os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    default:
        fmt.Printf("%s.\n", os)
    }
}
// PHP
echo "PHP runs on ";

switch (PHP_OS) {
    case "darwin":
        echo "OS X.";
        break;
    case "linux":
        echo "Linux.";
        break;
    default:
        echo PHP_OS;
}

For 循环

// Go
package main
import "fmt"
func main() {
    sum := 0

    for i := 0; i < 10; i++ {
        sum += i
    }

    fmt.Println(sum)
}
// PHP
$sum = 0;

for ($i = 0; $i < 10; $i++) {
    $sum += $i;
}
echo $sum;

While 循环

Go 自身没有 while 循环的语法。相应的,Go 使用for循环代替实现 while 循环.

// Go
package main
import "fmt"
func main() {
    sum := 1

    for sum < 100 {
        sum += sum
    }

    fmt.Println(sum)
}
// PHP
$sum = 1;
while ($sum < 100) {
    $sum += $sum;
}
echo $sum;

Foreach/Range

PHP 使用foreach迭代数组和对象。与之对应,Go 使用range迭代 slice 或 map。

/ Go
package main
import "fmt"
func main() {
    colours := []string{"Maroon", "Red", "Green", "Blue"}

    for index, colour := range colours {
        fmt.Printf("index: %d, colour: %s\n", index, colour)
    }
}
// PHP
$colours = ["Maroon", "Red", "Green", "Blue"];

foreach($colours as $index => $colour) {
    echo "index: {$index}, colour: {$colour}\n";
}

以上就是详解Go与PHP的语法对比的详细内容,更多关于Go与PHP的语法对比的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
window+nginx+php环境配置 附配置搭配说明
Dec 29 PHP
php下载文件的代码示例
Jun 29 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
PHP Switch 语句之学习笔记
Sep 21 PHP
CI(CodeIgniter)框架配置
Jun 10 PHP
php使用PDO操作MySQL数据库实例
Dec 30 PHP
使用Codeigniter重写insert的方法(推荐)
Mar 23 PHP
php PDO判断连接是否可用的实现方法
Apr 03 PHP
Nginx下ThinkPHP5的配置方法详解
Aug 01 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
Oct 08 PHP
Centos7安装swoole扩展操作示例
Mar 26 PHP
详解php中流行的rpc框架
如何在Mac上通过docker配置PHP开发环境
浅谈如何提高PHP代码质量之端到端集成测试
May 28 #PHP
浅谈如何提高PHP代码质量之单元测试
May 28 #PHP
浅谈如何提高PHP代码的质量
May 28 #PHP
详解thinkphp的Auth类认证
May 28 #PHP
如何理解PHP核心特性命名空间
May 28 #PHP
You might like
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
PHP正则表达式入门教程(推荐)
2016/05/18 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
PHP中关键字interface和implements详解
2017/06/14 PHP
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
js更优雅的兼容
2010/08/12 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
bootstrap警告框示例代码分享
2017/05/17 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
vue.js实现标签页切换效果
2018/06/07 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
深入分析在Python模块顶层运行的代码引起的一个Bug
2014/07/04 Python
python实现在无须过多援引的情况下创建字典的方法
2014/09/25 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
django中的setting最佳配置小结
2017/11/21 Python
Python中常用信号signal类型实例
2018/01/25 Python
python如何爬取个性签名
2018/06/19 Python
python 对key为时间的dict排序方法
2018/10/17 Python
python 调试冷知识(小结)
2019/11/11 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
Street One瑞士:德国现代时装公司
2019/10/09 全球购物
绍兴鲁迅故居导游词
2015/02/09 职场文书
药店营业员岗位职责
2015/04/14 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript