详解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 相关文章推荐
PHP 命名空间实例说明
Jan 27 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
使用php显示搜索引擎来的关键词
Feb 13 PHP
ThinkPHP控制器间实现相互调用的方法
Oct 31 PHP
php提交表单发送邮件的方法
Mar 20 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
Nov 17 PHP
php session的锁和并发
Jan 22 PHP
浅谈mysql_query()函数的返回值问题
Sep 05 PHP
PHP基于接口技术实现简单的多态应用完整实例
Apr 26 PHP
PHP 的Opcache加速的使用方法
Dec 29 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
Yii框架安装简明教程
May 15 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中使用Oracle数据库(6)
2006/10/09 PHP
PHP取得一个类的属性和方法的实现代码
2011/05/22 PHP
Yii PHP Framework实用入门教程(详细介绍)
2013/06/18 PHP
php+js实现图片的上传、裁剪、预览、提交示例
2013/08/27 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
繁简字转换功能
2006/07/19 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
node.js中的fs.fstat方法使用说明
2014/12/15 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
JavaScript中的值类型转换介绍
2014/12/31 Javascript
js实现图片无缝滚动
2015/12/23 Javascript
最常见和最有用的字符串相关的方法详解
2017/02/06 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
javascript json对象小技巧之键名作为变量用法分析
2019/11/11 Javascript
Python的math模块中的常用数学函数整理
2016/02/04 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
新闻系毕业生推荐信
2013/11/16 职场文书
大学生职业生涯规划书范文
2014/01/04 职场文书
2014年预备党员学习两会心得体会
2014/03/17 职场文书
公司经理任命书
2014/06/05 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
Python实现滑雪小游戏
2021/09/25 Python
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB