详解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的安全
Oct 09 PHP
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
Jul 03 PHP
PHP编译安装时常见错误解决办法
May 28 PHP
php实现仿写CodeIgniter的购物车类
Jul 29 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
Windows2003下php5.4安装配置教程(IIS)
Jun 30 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
Jul 02 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 09 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
tp5.1 框架数据库高级查询技巧实例总结
May 25 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
融入意大利的咖啡文化
2021/03/03 咖啡文化
用PHP生成静态HTML速度快类库
2007/03/18 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
PHP单例模式实例分析【防继承,防克隆操作】
2019/05/22 PHP
Javascript里使用Dom操作Xml
2006/09/20 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
详解JavaScript自定义函数
2020/07/29 Javascript
使用python Django做网页
2013/11/04 Python
Python在线运行代码助手
2016/07/15 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
python异常处理try except过程解析
2020/02/03 Python
python列表返回重复数据的下标
2020/02/10 Python
Python bytes string相互转换过程解析
2020/03/05 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
本科生求职简历的自我评价
2013/10/21 职场文书
企业管理培训感言
2014/01/27 职场文书
产品质量承诺范本
2014/03/31 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技