泽铭 發表於 2020-1-16 21:29:00

Go 与 PHP 的语法对比

<p>Go 是由 Google 设计的一门静态类型的编译型语言。它有点类似于 C,但是它包含了更多的优点,比如垃圾回收、内存安全、结构类型和并发性。它的并发机制使多核和网络机器能够发挥最大的作用。这是 GoLang 的最佳卖点之一。此外,Go 速度快,表现力强,干净且高效。这也是 Go 如此吸引开发者学习的原因。</p>
<p>PHP 是一种动态类型语言,它使新手更容易编写代码。现在的问题是,PHP 开发人员能否从动态类型语言切换到像 Go 这样的静态类型语言?为了找到答案,让我们对比一下 Go 和 PHP 之间的语法差异。</p>
<p><span class="LinkCard-backdrop"><span class="LinkCard-content"><span class="LinkCard-text"><span class="LinkCard-title" data-text="true">八重樱:怎么从一名码农成为架构师的必看知识点:目录大全(不定期更新)<span class="LinkCard-meta">​zhuanlan.zhihu.com</span></span></span></span></span></p>
<h2>数据类型</h2>
<ul>
<li>Go 同时支持有符号和无符号整数,而 PHP 只支持有符号整数。</li>
<li>另一个主要区别是数组。Go 对 array 和 map 有单独的类型,而 PHP 数组实际上是有序的 map。</li>
<li>Go 与 PHP 相比没有对象。但是,Go 有一个类似于&nbsp;<code>object</code>&nbsp;的&nbsp;<code>struct</code>&nbsp;类型。</li>
</ul>
<p>PHP 数据类型:</p>
<div class="highlight">
<pre><code class="language-text">boolean
string
integer // Signed integer, PHP does not support unsigned integers.
float (also known as "floats", "doubles", or "real numbers")
array
object
null
resource</code></pre>
</div>
<p>Go 数据类型:</p>
<div class="highlight">
<pre><code class="language-text">string
bool
intint8int16int32int64 // 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</code></pre>
</div>
<h2>变量</h2>
<p>Go 使用&nbsp;<code>var</code>&nbsp;声明全局变量和函数变量。但是,它也支持带有初始化程序的简写语法,但只能在函数内部使用。另一方面,PHP 仅支持带有初始化程序的变量声明。</p>
<div class="highlight">
<pre><code class="language-text">// 变量声明
// 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 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 := string{"hello"}    $a = []   // array</code></pre>
</div>
<h2>类型转换</h2>
<div class="highlight">
<pre><code class="language-text">// 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"</code></pre>
</div>
<h2>数组</h2>
<div class="highlight">
<pre><code class="language-text">// Go
var a string
a = "Hello"
a = "World"
// OR
a := string{"hello", "world"}
// PHP
$a = [
    "hello",
    "world"
];</code></pre>
</div>
<h2>Maps</h2>
<div class="highlight">
<pre><code class="language-text">// Go
m := mapstring{
    "first_name": "Foo",
    "last_name": "Bar",
}
// PHP
$m = [
    "first_name" =&gt; "Foo",
    "last_name" =&gt; "Bar"
];</code></pre>
</div>
<h2>对象类型</h2>
<p>Go 不支持对象。但是,您可以使用&nbsp;<code>structs</code>&nbsp;实现&nbsp;<code>object</code>&nbsp;之类的语法。</p>
<div class="highlight">
<pre><code class="language-text">// 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-&gt;Name = "Foo bar";
$person-&gt;Address = "Sydney, Australia";
echo $person-&gt;Name;
// 或使用类型转换
$person = (object) [
    'Name' =&gt; "Foo bar",
    'Address' =&gt; "Sydney, Australia"
];
echo $person-&gt;Name;</code></pre>
</div>
<h2>函数</h2>
<p>Go 和 PHP 函数之间的主要区别是; Go 函数可以返回任意数量的结果,而 PHP 函数只能返回一个结果。但是,PHP 可以通过返回数组来模拟相同的功能。</p>
<div class="highlight">
<pre><code class="language-text">// Go
package main
import "fmt"
func fullname(firstName string, lastName string) (string) {
    return firstName + " " + lastName
}
func main() {
    name := fullname("Foo", "Bar")
    fmt.Println(name)
}
// PHP
function fullname(string $firstName, string $lastName) : string {
    return $firstName . " " . $lastName;
}
$name = fullname("Foo", "Bar");
echo $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 swap(string $x, string $y): array {
    return [$y, $x];
}
[$a, $b] = swap('hello', 'world');
echo $a, $b;</code></pre>
</div>
<h2>控制语句</h2>
<p class="ztext-empty-paragraph">&nbsp;</p>
<h3>If-Else</h3>
<div class="highlight">
<pre><code class="language-text">// Go
package main
import (
    "fmt"
)
func compare(a int, b int) {
    if a &gt; 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 &gt; $b) {
      echo "a is bigger than b";
    } else {
      echo "a is NOT greater than b";
    }
}
compare(12, 10);</code></pre>
</div>
<h3>Switch</h3>
<p>根据 Golang 官方教程文档:</p>
<blockquote>Go 的 switch 与 C,C+,Java,JavaScript 和 PHP 中的类似,除了 Go 只运行选中的 case,而不是随后的所有 case。 实际上,&nbsp;<code>break</code>&nbsp;语句在这些语言中的每个 case 后都是必需的,而在 Go 中则是自动补充的。另一个重要的区别是 Go 的 switch cases 不需要是常量,并且涉及的值也不必是整数。</blockquote>
<div class="highlight">
<pre><code class="language-text">// 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;
}</code></pre>
</div>
<p>For 循环</p>
<div class="highlight">
<pre><code class="language-text">// Go
package main
import "fmt"
func main() {
    sum := 0

    for i := 0; i &lt; 10; i++ {
      sum += i
    }

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

for ($i = 0; $i &lt; 10; $i++) {
    $sum += $i;
}
echo $sum;</code></pre>
</div>
<h3>While 循环</h3>
<p>Go 自身没有 while 循环的语法。相应的,Go 使用&nbsp;<code>for</code>&nbsp;循环代替实现 while 循环.</p>
<div class="highlight">
<pre><code class="language-text">// Go
package main
import "fmt"
func main() {
    sum := 1

    for sum &lt; 100 {
      sum += sum
    }

    fmt.Println(sum)
}
// PHP
$sum = 1;
while ($sum &lt; 100) {
    $sum += $sum;
}
echo $sum;</code></pre>
</div>
<h3>Foreach/Range</h3>
<p>PHP 使用&nbsp;<code>foreach</code>&nbsp;迭代数组和对象。与之对应,Go 使用&nbsp;<code>range</code>&nbsp;迭代 slice 或 map。</p>
<div class="highlight">
<pre><code class="language-text">// 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 =&gt; $colour) {
    echo "index: {$index}, colour: {$colour}\n";
}</code></pre>
</div>
<p>今天的内容就是这些。我尽量使文章篇幅较小且简洁。作为 PHP 开发人员, 我尝试在练习 Go 时分享我的知识。也请随意分享你的想法。希望你们喜欢阅读本篇文章。</p>
<p><span class="LinkCard-backdrop"><span class="LinkCard-content"><span class="LinkCard-text"><span class="LinkCard-title" data-text="true">八重樱:怎么从一名码农成为架构师的必看知识点:目录大全(不定期更新)<span class="LinkCard-meta">​zhuanlan.zhihu.com</span></span></span></span></span></p><br><br>
来源:https://www.cnblogs.com/a609251438/p/12203340.html
頁: [1]
查看完整版本: Go 与 PHP 的语法对比