Установите g ccgo для тестирования буферов протокола 3 вместе с Go - PullRequest
5 голосов
/ 26 марта 2020

Я пытаюсь установить gccgo для тестирования Protocol Buffers 3 с Golang ... Я должен признаться, что вернулся к dev после 8 лет отдыха (и я не являюсь носителем языка), поэтому Спасибо за вашу снисходительность. Спасибо:)

Итак, после нескольких чтений я решил начать с README этого репо: https://github.com/golang/protobuf

1-й пункт пули: проверено!

Последняя версия буфера протокола установлена ​​на моей Ма c (protobuf-cpp-3.11.4.tar.gz, насколько я понимаю) https://github.com/protocolbuffers/protobuf/releases/tag/v3.11.4

$ ls $GOBIN
dlv*           gocode*        godef*         gopkgs*        protoc-gen-go*
go-outline*    gocode-gomod*  golint*        goreturns*

2-й пункт маркированного списка: Здесь я провел пару часов ... безуспешно: /

Конечно, установите компилятор Go и инструменты из https://golang.org/ См. https://golang.org/doc/install для получения подробной информации или, если вы используете g ccgo, следуйте инструкциям на https://golang.org/doc/install/gccgo

Насколько я понимаю, мне нужно установить gccgo, который является веткой компилятора g cc. Затем я прочитал, что gccgo на самом деле является собственной сборкой компилятора g cc, настроенной с опцией --enable-languages=c,c++,go (sr c https://golang.org/doc/install/gccgo) ... так почему есть ли специальная ветка на репо и где она находится? (https://gcc.gnu.org/git.html) I

Я просто сдамся, чтобы попытаться загрузить ветку g ccgo из репозитория git и найти репозиторий SVN:

$ svn checkout svn://gcc.gnu.org/svn/gcc/branches/gccgo gccgo`
gccgo$ ./configure --enable-languages=c,c++,go
...
configure: error: Building GCC requires GMP 4.2+, MPFR 3.1.0+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
their locations.  Source code for these libraries can be found at
their respective hosting sites as well as at
<https://gcc.gnu.org/pub/gcc/infrastructure/>.  See also
<http://gcc.gnu.org/install/prerequisites.html> for additional info.  If
you obtained GMP, MPFR and/or MPC from a vendor distribution package,
make sure that you have installed both the libraries and the header
files.  They may be located in separate packages.

Итак, я скачал gmp-6.2.0.tar.lz с https://gmplib.org/, что приводит меня к установке lzip перед распаковкой архива

$ brew install lzip
$ lunzip gmp-6.2.0.tar.lz
$ tar - xvzf gmp-6.2.0.tar
$ cd gmp-6.2.0
gmp-6.2.0$ ./configure
gmp-6.2.0$ make
gmp-6.2.0$ make install
gmp-6.2.0$ make check ( a few warnings but every test have been passed successfully )

Затем установил mpfr-3.1 .6.tar.gz

$ tar -xvzf mpfr-3.1.6.tar.gz
$ cd mpfr-3.1.6
mpfr-3.1.6$ ./configure
mpfr-3.1.6$ ./make
mpfr-3.1.6$ ./make install

... и попробуйте снова

gccgo$ ./configure --enable-languages=c,c++,go
...
The following requested languages could not be built: go
Supported languages are: c,brig,c,c++,d,fortran,lto,objc,obj-c++

Наконец

Я не уверен насчет каталога, в котором они говорят последний шаг ...

Создайте Go примеров в этом каталоге с помощью "make go". Это создает следующие исполняемые файлы в текущем каталоге: add_person_ go list_people_ go

make работает с gcc, представляя отдельный файл "правил", который описывает, как go из исходного кода в готовую программу, интерпретирует этот файл, выясняет, что нужно скомпилировать, и вызывает gcc. (источник { ссылка }). Итак, если g cc не скомпилирован должным образом, он не сможет работать.

protocolbuffer$ ls
add_person.go        add_person_test.go   addressbook.proto    list_people_test.go
add_person.go.txt    addressbook.pb.go    list_people.go
protocolbuffer$ make go
make: *** No rule to make target `go'.  Stop.

Extra tech. информация при необходимости:

~$ echo $GOPATH
/Users/me/Dev/Go/golib:/Users/me/Dev/Go/code
$GOBIN is /Users/me/Dev/Go/golib/bin
$ echo $GOBIN
/Users/me/Dev/Go/golib/bin

1 Ответ

4 голосов
/ 07 апреля 2020

Чтобы скомпилировать protobufs в go, вам нужно иметь go compiler и следующие пакеты

go get github.com/golang/protobuf
go get github.com/golang/protobuf/proto

Если ваш GOPATH включен в вашу среду PATH, вы должны иметь возможность выполнить protoc двоичный файл с вашего терминала.

Давайте попробуем простой пример. Сначала вы определяете схему protobuf, которая представляет некоторый объект. Это может выглядеть примерно так:

syntax="proto3";

package main;

message Person {
      string name = 1;
      int32 age = 2;
}

person.proto

Следующий шаг - скомпилировать его в go исходный код, используя protoc

protoc --go_out=. *.proto

Будет сгенерирован go файл исходного кода, представляющий ваш прото message inm файл person.pb.go.

Давайте посмотрим, как мы можем использовать его в нашем main.go

package main

import (
    "fmt"
    "os"

    "github.com/golang/protobuf/proto"
)

func main() {

    p := &Person{
        Name: "John Doe",
        Age:  30,
    }

    data, err := proto.Marshal(p)
    if err != nil {
        fmt.Printf("marshaling error: %v", err)
        os.Exit(1)
    }

  fmt.Printf("our raw protobuf object looks like: %+v\nits type is %T\n", data, data)

  // let's unmarshal it (from byte array) to an object we can use as Person
    newP := &Person{}
    err = proto.Unmarshal(data, newP)
    if err != nil {
        fmt.Printf("unmarshaling error: %v", err)
        os.Exit(1)
  }

  // now we can use our unmarshaled data as a struct
  fmt.Printf("newP name: %v\nnewP age: %v\nnewP type: %T\n", newP.GetName(), newP.GetAge(), newP)

}

Давайте запустим его

→ go run .
our raw protobuf object looks like: [10 8 74 111 104 110 32 68 111 101 16 30]
its type is []uint8
newP name:  John Doe
newP age:  30
newP type: *main.Person

Вы можете посмотреть на автоматически сгенерированный исходный код в person.pb. go. Надеюсь, это поможет.

...