Ein Szenario, auf das ich kürzlich bei der Arbeit gestoßen bin, war, dass eine Funktion eines Drittanbieters im PHP-Projekt verwendet werden musste und es zufällig eine in Golang geschriebene Klassenbibliothek gab. Es stellt sich also die Frage, wie eine Kommunikation zwischen verschiedenen Sprachen erreicht werden kann. Schauen wir uns unten um.
Konventionelle Lösung (Empfohlenes Lernen: PHP-Video-Tutorial)
1 schreibt einen http/TCP-Dienst und PHP kommuniziert mit Golang über http/TCP
2. Golang ist als PHP-Erweiterung gekapselt.
3. PHP ruft die ausführbare Golang-Datei über Systembefehle auf
Vorhandene Probleme
1. HTTP-Anfragen und Netzwerk-E/A werden viel Zeit in Anspruch nehmen
2. Eine große Menge Code muss gekapselt werden
3. Jedes Mal, wenn PHP ein Golang-Programm aufruft, Es braucht eine einmalige Initialisierung, die viel Zeit in Anspruch nimmt zeitaufwendig)
2. Alle Anfragen müssen nicht über das Netzwerk gehen
3. Versuchen Sie, den Code nicht stark zu ändern
1. Einfache Golang-Kapselung, kompilieren Sie die Klassenbibliothek eines Drittanbieters in eine ausführbare Datei
2 Kommunikation über eine Zwei-Wege-Pipeline
1: Es ist nur eine minimale Kapselung der ursprünglichen Golang-Klassenbibliothek erforderlich
2: Beste Leistung (IPC-Kommunikation ist die beste Möglichkeit, zwischen Prozessen zu kommunizieren)
3: Keine Notwendigkeit, Netzwerkanfragen zu stellen, was viel Zeit spart
4: Das Programm muss nur einmal initialisiert werden und bleibt immer im Speicher
Spezifische Implementierungsschritte
package main import ( "fmt" "github.com/yanyiwu/gojieba" "strings" ) func main() { x := gojieba.NewJieba() defer x.Free() s := "小明硕士毕业于中国科学院计算所,后在日本京都大学深造" words := x.CutForSearch(s, true) fmt.Println(strings.Join(words, "/")) }
2 ausführen: Der angepasste Code lautet:
package main import ( "bufio" "fmt" "github.com/yanyiwu/gojieba" "io" "os" "strings" ) func main() { x := gojieba.NewJieba( "/data/tmp/jiebaDict/jieba.dict.utf8", "/data/tmp/jiebaDict/hmm_model.utf8", "/data/tmp/jiebaDict/user.dict.utf8" ) defer x.Free() inputReader := bufio.NewReader(os.Stdin) for { s, err := inputReader.ReadString('\n') if err != nil && err == io.EOF { break } s = strings.TrimSpace(s) if s != "" { words := x.CutForSearch(s, true) fmt.Println(strings.Join(words, " ")) } else { fmt.Println("get empty \n") } } }
Mit nur ein paar einfachen Anpassungen können Sie Folgendes erreichen: Empfangen einer Zeichenfolge von der Standardeingabe, nach der Wortsegmentierung Ausgabe
Test:
# go build test # ./test # //等待用户输入,输入”这是一个测试“ # 这是 一个 测试 //程序
Das obige ist der detaillierte Inhalt vonWie man mit PHP und Golang zusammenarbeitet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!