PHP轉Go系列:字串

平也發表於2019-06-10

字串的賦值

在PHP中,字串的賦值雖然只有一行,其實包含了兩步,一是宣告變數,二是賦值給變數,同一個變數可以任意重新賦值。

$str = 'Hello World!';
$str = 'hia';

Go語言實現上述兩步也可以用一行語句解決,就是通過標識var賦值時同時宣告變數,切記等號右側的字串不能用單引號,對變數的後續賦值也不能再重新宣告,否則會報錯。除此之外,定義的變數不使用也會報錯,從這點來看,Go還是比PHP嚴格很多的,規避了很多在開發階段產生的效能問題。

var str = "Hello World!"
str = "hia"

關於宣告,Go提供了一種簡化方式,不需要在行首寫var,只需將等號左側加上一個冒號就好了,切記這只是替代了宣告語句,它並不會像PHP那樣用一個賦值符號來統一所有的賦值操作。

str := "Hello World!"
str = "hia"

字串的輸出

PHP中的輸出非常簡單,一個echo就搞定了。

<?php
    echo 'Hello World!';
?>

而Go不一樣的是,呼叫它的輸出函式前需要先引入包fmt,這個包提供了非常全面的輸入輸出函式,如果只是輸出普通字串,那麼和PHP對標的函式就是Print了,從這點來看,Go更有一種萬物皆物件的感覺。

import "fmt"

func main() {
    fmt.Print("Hello world!")
}

在PHP中還有一個格式化輸出函式sprintf,可以用佔位符替換字串。

echo sprintf('name:%s', '平也');  //name:平也

在Go中也有同名同功能的字串格式化函式。

fmt.Print(fmt.Sprintf("name:%s", "平也"))

官方提供的預設佔位符有以下幾種,感興趣的同學可以自行了解。

bool:                    %t
int, int8 etc.:          %d
uint, uint8 etc.:        %d, %#x if printed with %#v
float32, complex64, etc: %g
string:                  %s
chan:                    %p
pointer:                 %p

字串的相關操作

字串長度

在PHP中通過strlen計算字串長度。

echo strlen('平也');  //output: 6

在Go中也有類似函式len

fmt.Print(len("平也"))   //output: 6

因為統計的是ASCII字元個數或位元組長度,所以兩個漢字被認定為長度6,如果要統計漢字的數量,可以使用如下方法,但要先引入unicode/utf8包。

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    fmt.Print(utf8.RuneCountInString("平也"))    //output: 2
}

字串擷取

PHP有一個substr函式用來擷取任意一段字串。

echo substr('hello,world', 0, 3); //output: hel

Go中的寫法有些特別,它是將字串當做陣列,擷取其中的某段字元,比較麻煩的是,在PHP中可以將第二個引數設定為負數進行反向取值,但是Go無法做到。

str := "hello,world"
fmt.Print(str[0:3])  //output: hel

字串搜尋

PHP中使用strpos查詢某個字串出現的位置。

echo strpos('hello,world', 'l'); //output: 2

Go中需要先引入strings包,再呼叫Index函式來實現。

fmt.Print(strings.Index("hello,world", "l")) //output: 2

字串替換

PHP中替換字串使用str_replace內建函式。

echo str_replace('world', 'girl', 'hello,world'); //output: hello,girl

Go中依然需要使用strings包中的函式Replace,不同的是,第四個引數是必填的,它代表替換的次數,可以為0,代表不替換,但沒什麼意義。還有就是字串在PHP中放在第三個引數,在Go中是第一個引數。

fmt.Print(strings.Replace("hello,world", "world", "girl", 1)) //output: hello,girl

字串連線

在PHP中最經典的就是用點來連線字串。

echo 'hello' . ',' . 'world'; //output: hello,world

在Go中用加號來連線字串。

fmt.Print("hello" + "," + "world") //output: hello,world

除此之外,還可以使用strings包中的Join函式連線,這種寫法非常類似與PHP中的陣列拼接字串函式implode

str := []string{"hello", "world"}
fmt.Print(strings.Join(str, ",")) //output: hello,world

字串編碼

PHP中使用內建函式base64_encode來進行編碼。

echo base64_encode('hello, world'); //output: aGVsbG8sIHdvcmxk

在Go中要先引入encoding/base64包,並定義一個切片,再通過StdEncoding.EncodeToString函式對切片編碼,比PHP要複雜一些。

import (
    "encoding/base64"
    "fmt"
)

func main() {
    str := []byte("hello, world")
    fmt.Print(base64.StdEncoding.EncodeToString(str))
}

以上是PHP與Go在常用的字串處理場景中的區別,感興趣的同學可以自行了解。

相關文章