详解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动态创建Flash动画
Oct 09 PHP
php 正则匹配函数体
Aug 25 PHP
discuz程序的PHP加密函数原理分析
Aug 05 PHP
比较discuz和ecshop的截取字符串函数php版
Sep 03 PHP
解析php类的注册与自动加载
Jul 05 PHP
PHP中替换键名的简易方法示例详解
Jan 07 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
Feb 16 PHP
PHP中的类型约束介绍
May 11 PHP
session 加入redis的实现代码
Jul 15 PHP
PHP实现Unicode编码相互转换的方法示例
Nov 17 PHP
PHP基于IMAP收取邮件的方法示例
Aug 07 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 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封装分页函数实现文本分页和数字分页
2014/10/23 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
2017/09/02 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
深入研究React中setState源码
2017/11/17 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
浅谈Python基础—判断和循环
2019/03/22 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
韩国现代百货官网:Hmall
2018/03/21 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
办公室主任主任岗位责任制
2014/02/11 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
五四演讲稿范文
2014/09/03 职场文书
教师作风整顿个人剖析材料
2014/10/10 职场文书
个人优缺点总结
2015/02/28 职场文书
年度考核登记表个人总结
2015/03/06 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
mysql幻读详解实例以及解决办法
2022/06/16 MySQL
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS