go generate based graphql server library

gqlgen Continuous Integration Read the Docs GoDoc

gqlgen

What is gqlgen?

gqlgen is a Go library for building GraphQL servers without any fuss.

  • gqlgen is based on a Schema first approach — You get to Define your API using the GraphQL Schema Definition Language.
  • gqlgen prioritizes Type safety — You should never see map[string]interface{} here.
  • gqlgen enables Codegen — We generate the boring bits, so you can focus on building your app quickly.

Still not convinced enough to use gqlgen? Compare gqlgen with other Go graphql implementations

Getting Started

  • To install gqlgen run the command go get github.com/99designs/gqlgen in your project directory.
  • You could initialize a new project using the recommended folder structure by running this command go run github.com/99designs/gqlgen init.

You could find a more comprehensive guide to help you get started here.
We also have a couple of real-world examples that show how to GraphQL applications with gqlgen seamlessly, You can see these examples here or visit godoc.

Reporting Issues

If you think you've found a bug, or something isn't behaving the way you think it should, please raise an issue on GitHub.

Contributing

We welcome contributions, Read our Contribution Guidelines to learn more about contributing to gqlgen

Frequently asked questions

How do I prevent fetching child objects that might not be used?

When you have nested or recursive schema like this:

type User {
  id: ID!
  name: String!
  friends: [User!]!
}

You need to tell gqlgen that it should only fetch friends if the user requested it. There are two ways to do this;

  • Using Custom Models

Write a custom model that omits the friends field:

type User struct {
  ID int
  Name string
}

And reference the model in gqlgen.yml:

# gqlgen.yml
models:
  User:
    model: github.com/you/pkg/model.User # go import path to the User struct above
  • Using Explicit Resolvers

If you want to Keep using the generated model, mark the field as requiring a resolver explicitly in gqlgen.yml like this:

# gqlgen.yml
models:
  User:
    fields:
      friends:
        resolver: true # force a resolver to be generated

After doing either of the above and running generate we will need to provide a resolver for friends:

func (r *userResolver) Friends(ctx context.Context, obj *User) ([]*User, error) {
  // select * from user where friendid = obj.ID
  return friends,  nil
}

You can also use inline config with directives to achieve the same result

directive @goModel(model: String, models: [String!]) on OBJECT
    | INPUT_OBJECT
    | SCALAR
    | ENUM
    | INTERFACE
    | UNION

directive @goField(forceResolver: Boolean, name: String) on INPUT_FIELD_DEFINITION
    | FIELD_DEFINITION

type User @goModel(model: "github.com/you/pkg/model.User") {
    id: ID!         @goField(name: "todoId")
    friends: [User!]!   @goField(forceResolver: true)
}

Can I change the type of the ID from type String to Type Int?

Yes! You can by remapping it in config as seen below:

models:
  ID: # The GraphQL type ID is backed by
    model:
      - github.com/99designs/gqlgen/graphql.IntID # An go integer
      - github.com/99designs/gqlgen/graphql.ID # or a go string

This means gqlgen will be able to automatically bind to strings or ints for models you have written yourself, but the first model in this list is used as the default type and it will always be used when:

  • Generating models based on schema
  • As arguments in resolvers

There isn't any way around this, gqlgen has no way to know what you want in a given context.

Other Resources

Owner
99designs
Global creative platform for designers and clients
99designs
Comments
  • Who's using gqlgen in production?

    Who's using gqlgen in production?

    We are preparing a blog post and would like to get a feel for who is currently using gqlgen?

    Might as well go first; 99designs has been running gqlgen for several months now.

  • Is this project still maintained?

    Is this project still maintained?

    What happened?

    I recently used gqlgen to build a GraphQL API for https://crossplane.io, but I'm now a little worried that the project might be unmaintained. I notice no PRs have been merged for a little over 3 months, and there has not been a new release for almost a year. I maintain a large open source project myself so I know business priorities change and that sometimes things slow down for a while; mostly what I am looking for here is reassurance that there are still folks investing in this project and that it makes sense to continue relying on it to build GraphQL APIs.

  • Make Input Schema optional

    Make Input Schema optional

    What happened?

    I have some minimal apps using gqlgen that need to update the User Model, updating the using

    But when regenerate gqlgen it should use pointers for the password where the password are not inputed from user and then causing (nil pointer)

    What did you expect?

    So when updating the User , the user can optionally input password or not.

    Minimal graphql.schema and models to reproduce

    type Mutation {
        updateUser(input: UpdateUser!): User!
    }
    
    input UpdateUser {
        id: ID!
        name: String!
        password: String
    }
    

    versions

    • gqlgen version? V.0.9.3
    • go version? 1.12.9
    • dep or go modules? gomod
  • Input types: null vs unspecified

    Input types: null vs unspecified

    Expected Behaviour

    Per spec:

    If the value null was provided for an input object field, and the field’s type is not a non‐null type, an entry in the coerced unordered map is given the value null. In other words, there is a semantic difference between the explicitly provided value null versus having not provided a value.

    Actual Behavior

    Right now its not possible (as far as I know) to differentiate between null and not having provided a value.

    Minimal graphql.schema and models to reproduce

    input UpdateUserInput {
      id: ID!
      name: String
      age: Int
    }
    

    produces

    type UpdateUserInput struct {
    	ID   string  `json:"id"`
    	Name *string `json:"name"`
    	Age  *int    `json:"age"`
    }
    

    If the user now submits the input with only id and name, I don't know what to do with the age. Did the user want to clear his age (i.e. set it to null) or did he not want to update it (i.e. not specified)?

  • Split generated stubs into multiple files

    Split generated stubs into multiple files

    can we generate go-code based on schema to multiple files and if the file is already exist, then just update the files ?

    may be like bellow :

    schema.graphql

    schema {
        query: MyQuery
        mutation: MyMutation
    }
    
    type MyQuery {
        todo(id: Int!): Todo
        lastTodo: Todo
        todos: [Todo!]!
    }
    
    type MyMutation {
        createTodo(todo: TodoInput!): Todo!
        updateTodo(id: Int!, changes: Map!): Todo
    }
    
    type Todo {
        id: Int!
        text: String!
        done: Boolean!
    }
    
    input TodoInput {
        text: String!
        done: Boolean
    }
    

    gqlgen.yml

    schema: schema/schema.graphql
    exec:
      filename: generated/generated.go
      package: generated
    model:
      filename: models/model.go
    #  multiple_files: true ## maybe we can add this config
    resolver:
      filename: resolvers/resolver.go
      package: resolvers
    #  multiple_files: true ## maybe we can add this config
      type: Resolver
    struct_tag: json
    

    generated files

    models/
         model.go
         todo.go
         todoInput.go
    resolvers/
         resolver.go
         queryResolver.go
         mutationResolver.go
         todoResolver.go
    

    it would be nice if we can work on specific file.

    Thank you.

  • Apollo Federation MVP

    Apollo Federation MVP

    This PR is mostly to get some eyes on the current architecture and what can be improved/re-written.

    Once that looks good, I'll move on to adding unit/e2e tests

    Fixes https://github.com/99designs/gqlgen/issues/740

  • 0.17.14 generate getters for interfaces problem

    0.17.14 generate getters for interfaces problem

    What happened?

    When upgrading to 0.17.14 my code generation started to fail due to the new generation of getters for interfaces. It's due to interfaces returning other interfaces I think.

    What did you expect?

    Code generation to result in valid code

    Minimal graphql.schema and models to reproduce

    Reproduction repo: https://github.com/argoyle/gqlgen-implements

    versions

    • go run github.com/99designs/gqlgen version? 0.17.14
    • go version? 1.19
  • go generate gives missing go sum entry for module errors

    go generate gives missing go sum entry for module errors

    What happened?

    running go generate ./... gives go package errors

    ../../../../../go/pkg/mod/github.com/99designs/[email protected]/cmd/gen.go:9:2: missing go.sum entry for module providing package github.com/urfave/cli/v2
    ../../../../../go/pkg/mod/github.com/99designs/[email protected]/internal/imports/prune.go:15:2: missing go.sum entry for module providing package golang.org/x/tools/go/ast/astutil
    ../../../../../go/pkg/mod/github.com/99designs/[email protected]/internal/code/packages.go:8:2: missing go.sum entry for module providing package golang.org/x/tools/go/packages
    ../../../../../go/pkg/mod/github.com/99designs/[email protected]/internal/imports/prune.go:16:2: missing go.sum entry for module providing package golang.org/x/tools/imports
    graph/resolver.go:3: running "go": exit status 1
    

    if i run go get on each of these dependencies the error goes away and i can generate files just fine, but they come back after 1-2 days. so its quite annoying to keep having to run these.

    I've spoken to a couple of people who used gqlgen before and none of them had any problems so I'm sure its not a super big deal. But just looking to get some help to get rid of these errors.

    What did you expect?

    go generate to generate the files without these errors

    Minimal graphql.schema and models to reproduce

    this happens with even the default generated schema

    versions

    • gqlgen version? v0.13.0
    • go version? go1.16beta1 darwin/arm64
    • dep or go modules? go modules
  • Could not connect to websocket

    Could not connect to websocket

    Could not connect to websocket endpoint wss://127.0.0.1:4000/api/query. Please check if the endpoint url is correct.

    Im using mux.

    resolver.go

    var TicketSub struct {
    	sync.RWMutex
    	Subscribers map[string]chan *gqlapi.TicketStatusChangePayload
    }
    
    func (r *subscriptionRootResolver) TicketStatusChanged(ctx context.Context) (<-chan *gqlapi.TicketStatusChangePayload, error) {
    	user := &models.User{
    		UUID: "e70e78bb-9d08-405d-a0ed-266ec703de19",
    	}
    	events := make(chan *gqlapi.TicketStatusChangePayload, 1)
    
    	go func() {
    		<-ctx.Done()
    		TicketSub.Lock()
    		delete(TicketSub.Subscribers, user.UUID)
    		TicketSub.Unlock()
    	}()
    
    	TicketSub.Lock()
    	TicketSub.Subscribers[user.UUID] = events
    	TicketSub.Unlock()
    
    	return events, nil
    }
    
    func (r *queryRootResolver) SubscriptionTest(ctx context.Context) (err error) {
    	id := uuid.New().String()
    	notifyTicketStatusChange("e70e78bb-9d08-405d-a0ed-266ec703de19", id, fmt.Sprintf("Ticket (uuid=%s) status changed.", id))
    	return
    }
    

    main.go

    func main() {
    	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    	Start(ctx)
    
    	// Wait for interrupt signal to gracefully shutdown the server with
    	// a timeout of 10 seconds.
    	sigs := make(chan os.Signal, 1)
    	signal.Notify(sigs,
    		os.Kill,
    		os.Interrupt,
    		syscall.SIGHUP,
    		syscall.SIGINT,
    		syscall.SIGTERM,
    		syscall.SIGQUIT)
    	<-sigs
    
    	defer func() {
    		cancel()
    	}()
    
    }
    
    func Start(ctx context.Context) {
    	go start(ctx)
    }
    
    func start(ctx context.Context) {
    	cfg := gqlapi.Config{
    		Resolvers: &resolvers.Resolver{},
    		Directives: gqlapi.DirectiveRoot{
    			Auth:    directives.Auth,
    		},
    	}
    	r := mux.NewRouter()
    	r.HandleFunc("/", handler.Playground("GraphQL playground", "/api/query"))
    
    	upgrader := websocket.Upgrader{
    		CheckOrigin: func(r *http.Request) bool {
    			return true
    		},
    		EnableCompression: true,
    	}
    
    	options := []handler.Option{
    		handler.RecoverFunc(func(ctx context.Context, err interface{}) error {
    			// notify bug tracker...
    			return fmt.Errorf("Internel server error.")
    		}),
    		handler.WebsocketUpgrader(upgrader),
    	}
    
    	r.HandleFunc("/api/query", handler.GraphQL(
    		gqlapi.NewExecutableSchema(cfg),
    		options...,
    	))
    	srv := &http.Server{
    		Handler: r,              //
    		Addr:    "0.0.0.0:4000", //
    	}
    	srv.SetKeepAlivesEnabled(true)
    	log.Fatal(srv.ListenAndServeTLS("cert.pem", "key.pem"))
    }
    

    Screenshot from 2019-03-19 18 56 02

    I can push message via websocket tunnel as you can see on the attached screenshot, but it closed after about 10-15 seconds.

  • Support for apollo batching

    Support for apollo batching

    It would be awesome if we could detect batch operations based on a header and then parse the incoming request as an array of operations or a single operation.

  • use

    use "embed" in generated code

    I work in a codebase that uses gqlgen heavily for a large graphql monolith. There are 384k lines of code in the files generated by gqlgen. We check in all these files into git because it takes a long time to generate them (and because it's a lot simpler to work that way).

    This PR changes the generated files to use the embed feature of go to reduce the size of the generated files and reduce the chance of having to resolve PR conflicts.

    I think that the complexity of the change is fairly low and there is no down side to introducing it. I made sure it has reasonable test coverage. It should be backwards compatible and doesn't change any behaviour.

    I have:

    • [x] Added tests covering the bug / feature (see testing)
    • [n/a] Updated any relevant documentation (see docs)
  • how to limit the amount of the alias

    how to limit the amount of the alias

    What happened?

    I can't limit the amount of the alias. FixedComplexityLimit limits the complexity of the query.

    What did you expect?

    I want to limit the amount of the alias to prevent the batching attack. Let's try to explain by giving an example.

    query {
      productsByIds(productIds: "353573855") {
        active {
          id
          path
          title
      }
      productsByIds2: productsByIds(productIds: "353573855") {
        active {
          id
          path
          title
        }
      }
    
    

    The above query should give an error. However, the below should work. This is just an example I have more complex schemas that's why the complexity limit didn't work for me.

    query {
     productsByIds(productIds: "353573855") {
       active {
         id
         path
         title
     }
     products {
       active {
         id
         path
         title
       }
     }
    }
    

    Minimal graphql.schema and models to reproduce

    versions

    • go run github.com/99designs/gqlgen version v0.17.22
    • go version 1.19
  • Federation does not honor extend on `type Query` when introspecting

    Federation does not honor extend on `type Query` when introspecting

    What happened?

    After running generate and running the service, I use introspection (rover graph introspect http://localhost:8888/query) to generate a schema.gql (SDL). The output for type Query{} does not carry over the extend prefix from the schema. My Apollo federated server will not resolve queries to my subgraph unless the Query type is extended. Is this a bug or is there an alternate way to generate a Federated SDL?

    What did you expect?

    Introspected SDL should contain extend type Query { instead of type Query {

    Minimal graphql.schema and models to reproduce

    type CheckIssue {id: Int}
    
    extend type Query {
        issue: CheckIssue!
    }
    

    versions

    • go run github.com/99designs/gqlgen version v0.17.22
    • go version 1.19.4 darwin/arm64
  • Non-convenient go enum value

    Non-convenient go enum value

    What happened?

    I tried to generate enum, but one value after generation seems non-convenient :)

    Interesting that it only occurred with SLACK value. I've used bunch of other names and it's fine. I've did several tests and seems like problem in SLA inside of SLACK. It processes it like abbreviation :)

    What did you expect?

    I'm expecting PlatformIDSlack instead of PlatformIDSLACk.

    Minimal graphql.schema and models to reproduce

    Schema:

    enum PlatformID {
      ASANA
      SLACK
    }
    
    type Query {
      myUser(email: String!): User!
    }
    
    type User {
      id: String!
      email: String!
    }
    

    Generated models:

    type PlatformID string
    
    const (
    	PlatformIDAsana PlatformID = "ASANA"
    	PlatformIDSLACk PlatformID = "SLACK"
    )
    
    var AllPlatformID = []PlatformID{
    	PlatformIDAsana,
    	PlatformIDSLACk,
    }
    

    gclgen.yml:

    # Where are all the schema files located? globs are supported eg  src/**/*.graphqls
    schema:
      - graph/*.graphqls
    
    # Where should the generated server code go?
    exec:
      filename: graph/generated.go
      package: graph
    
    # Uncomment to enable federation
    # federation:
    #   filename: graph/federation.go
    #   package: graph
    
    # Where should any generated models go?
    model:
      filename: graph/model/models_gen.go
      package: model
    
    # Where should the resolver implementations go?
    resolver:
      layout: follow-schema
      dir: graph
      package: graph
    
    # Optional: turn on use ` + "`" + `gqlgen:"fieldName"` + "`" + ` tags in your models
    # struct_tag: json
    
    # Optional: turn on to use []Thing instead of []*Thing
    # omit_slice_element_pointers: false
    
    # Optional: turn off to make struct-type struct fields not use pointers
    # e.g. type Thing struct { FieldA OtherThing } instead of { FieldA *OtherThing }
    # struct_fields_always_pointers: true
    
    # Optional: turn off to make resolvers return values instead of pointers for structs
    # resolvers_always_return_pointers: true
    
    # Optional: set to speed up generation time by not performing a final validation pass.
    # skip_validation: true
    
    # gqlgen will search for any type names in the schema in these go packages
    # if they match it will use them, otherwise it will generate them.
    autobind:
    #  - "github.com/bynov/test-graphql/graph/model"
    
    # This section declares type mapping between the GraphQL and go type systems
    #
    # The first line in each type will be used as defaults for resolver arguments and
    # modelgen, the others will be allowed when binding to fields. Configure them to
    # your liking
    models:
      ID:
        model:
          - github.com/99designs/gqlgen/graphql.ID
          - github.com/99designs/gqlgen/graphql.Int
          - github.com/99designs/gqlgen/graphql.Int64
          - github.com/99designs/gqlgen/graphql.Int32
      Int:
        model:
          - github.com/99designs/gqlgen/graphql.Int
          - github.com/99designs/gqlgen/graphql.Int64
          - github.com/99designs/gqlgen/graphql.Int32
    
    

    versions

    • go run github.com/99designs/gqlgen version v0.17.22
    • go version go1.19.4 darwin/amd64
  • WithStack not declared by package errors

    WithStack not declared by package errors

    What happened?

    I generated models & resolvers and implemented several resolver's methods. In these methods I used errors.WithStack(err) from github.com/pkg/errors package.

    When I run generate one more time, it automatically replaces github.com/pkg/errors with errors and after that complaining that method not declared.

    What did you expect?

    I expect that it won't change import for github.com/pkg/errors package.

    Minimal graphql.schema and models to reproduce

    Schema:

    type Query {
      myUser(email: String!): User!
    }
    
    type User {
      id: String!
      email: String!
    }
    

    Resolvers with implementation

    package graph
    
    // This file will be automatically regenerated based on the schema, any resolver implementations
    // will be copied through when generating and any unknown code will be moved to the end.
    // Code generated by github.com/99designs/gqlgen version v0.17.22
    
    import (
    	"context"
    	"github.com/pkg/errors"
    
    	"github.com/bynov/test-graphql/graph/model"
    )
    
    // MyUser is the resolver for the myUser field.
    func (r *queryResolver) MyUser(ctx context.Context, email string) (*model.User, error) {
    	if email == "1" {
    		return nil, errors.WithStack(errors.New("test"))
    	}
    
    	return &model.User{
    		ID:    "1",
    		Email: email,
    	}, nil
    }
    
    // Query returns QueryResolver implementation.
    func (r *Resolver) Query() QueryResolver { return &queryResolver{r} }
    
    type queryResolver struct{ *Resolver }
    

    gclgen.yml

    # Where are all the schema files located? globs are supported eg  src/**/*.graphqls
    schema:
      - graph/*.graphqls
    
    # Where should the generated server code go?
    exec:
      filename: graph/generated.go
      package: graph
    
    # Uncomment to enable federation
    # federation:
    #   filename: graph/federation.go
    #   package: graph
    
    # Where should any generated models go?
    model:
      filename: graph/model/models_gen.go
      package: model
    
    # Where should the resolver implementations go?
    resolver:
      layout: follow-schema
      dir: graph
      package: graph
    
    # Optional: turn on use ` + "`" + `gqlgen:"fieldName"` + "`" + ` tags in your models
    # struct_tag: json
    
    # Optional: turn on to use []Thing instead of []*Thing
    # omit_slice_element_pointers: false
    
    # Optional: turn off to make struct-type struct fields not use pointers
    # e.g. type Thing struct { FieldA OtherThing } instead of { FieldA *OtherThing }
    # struct_fields_always_pointers: true
    
    # Optional: turn off to make resolvers return values instead of pointers for structs
    # resolvers_always_return_pointers: true
    
    # Optional: set to speed up generation time by not performing a final validation pass.
    # skip_validation: true
    
    # gqlgen will search for any type names in the schema in these go packages
    # if they match it will use them, otherwise it will generate them.
    autobind:
    #  - "github.com/bynov/test-graphql/graph/model"
    
    # This section declares type mapping between the GraphQL and go type systems
    #
    # The first line in each type will be used as defaults for resolver arguments and
    # modelgen, the others will be allowed when binding to fields. Configure them to
    # your liking
    models:
      ID:
        model:
          - github.com/99designs/gqlgen/graphql.ID
          - github.com/99designs/gqlgen/graphql.Int
          - github.com/99designs/gqlgen/graphql.Int64
          - github.com/99designs/gqlgen/graphql.Int32
      Int:
        model:
          - github.com/99designs/gqlgen/graphql.Int
          - github.com/99designs/gqlgen/graphql.Int64
          - github.com/99designs/gqlgen/graphql.Int32
    

    Adding new type:

    type NewUser {
      id: String!
    }
    

    Run generate go run github.com/99designs/gqlgen generate and got error: validation failed: packages.Load: /Users/bynov/go/src/github.com/bynov/test-graphql/graph/schema.resolvers.go:17:22: WithStack not declared by package errors

    versions

    • go run github.com/99designs/gqlgen version v0.17.22
    • go version go1.19.4 darwin/amd64
  • gqlgen only return 200 error

    gqlgen only return 200 error

    I want to return Http status code errors(400,500) in gqlgen Graphql Query

    I tried

    "github.com/vektah/gqlparser/v2/gqlerror"
    
    err := gqlerror.Error{
    		Message: "Invalid Data",
    		Extensions: map[string]interface{}{
    			"code": 400,
    		},
    	}
    

    this method.But its return 200 APi response with this error body.

    How to change this 200 error to 400 error in GQL API?

  • fix #2485 remote named basics should not need scalar

    fix #2485 remote named basics should not need scalar

    Fixes #2485

    Running go generate when remote named basics (string, int, boolean, float) are used in go struct will display an error message saying <type> is incompatible with <named_type>. We then need to create a scalar with its related MarshalFunc and UnmarshalFunc to remove the error message. This will lead to many copy-paste of the same MarshalFunc and UnmarshalFunc with only the type being changed.

    I have:

    • [x] Added tests covering the bug / feature (see testing)
    • [ ] Updated any relevant documentation (see docs)
The easiest way to make API documents for GraphQL

Document Generator for GraphQL gqldoc is now alpha gqldoc is command line tool to generate documents from GraphQL schema or your GraphQL endpoint. the

Dec 20, 2022
A port of the parser from graphql-js into golang

gqlparser This is a parser for graphql, written to mirror the graphql-js reference implementation as closely while remaining idiomatic and easy to use

Dec 27, 2022
gqlanalysis makes easy to develop static analysis tools for GraphQL in Go.
gqlanalysis makes easy to develop static analysis tools for GraphQL in Go.

gqlanalysis gqlanalysis defines the interface between a modular static analysis for GraphQL in Go. gqlanalysis is inspired by go/analysis. gqlanalysis

Dec 14, 2022
libraries for various programming languages that make it easy to generate per-process trace files that can be loaded into chrome://tracing
libraries for various programming languages that make it easy to generate per-process trace files that can be loaded into chrome://tracing

chrometracing: chrome://tracing trace_event files The chrometracing directory contains libraries for various programming languages that make it easy t

Oct 6, 2022
Go package to generate and manage color palettes & schemes 🎨
Go package to generate and manage color palettes & schemes 🎨

Go package to generate and manage color palettes & schemes

Dec 29, 2022
Generate Go clients from anchor IDLs for Solana blockchain programs

usage anchor-go --src=/path/to/idl.json Generated Code will be generated and saved to ./generated/. TODO instructions accounts types events errors han

Jan 6, 2023
Utilities to generate (reference) documentation for the docker CLI

About This is a library containing utilities to generate (reference) documentation for the docker CLI on docs.docker.com. Disclaimer This library is i

Dec 28, 2022
generate random data like name, email, uuid, address, images and etc.

gg-rand generate random data like name, email, uuid, address, images and etc. build and install: make run: gg-rand $ gg-rand SillyName : Knavesa

Nov 16, 2022
Generate simple CHANGELOG

changelog Generate simple CHANGELOG Install Download the one that suits your environment and place it in a location that is in your PATH. https://gith

Oct 10, 2021
Generate some random data

fake-data-generator-api generate some random data installing and using

Dec 2, 2022
A utility to generate SPDX-compliant Bill of Materials manifests

Kubernetes Template Project The Kubernetes Template Project is a template for starting new projects in the GitHub organizations owned by Kubernetes. A

Jan 1, 2023
Generate signal for a thing for golang

go_kafka_signal generate signal for a thing go build producer.go ./producer -f ~

Dec 24, 2021
Protoc-gen-fieldmask - Generate FieldMask utility functions for protobuf

protoc-gen-fieldmask Generate FieldMask utility functions for protobuf Generated

Aug 20, 2022
An application written in Go to generate fractals like the Mandelbrot set and the Julia set.
An application written in Go to generate fractals like the Mandelbrot set and the Julia set.

Fractals An application written in Go to generate fractals like the Mandelbrot set and the Julia set. Screenshots Mandelbrot set Julia set Prerequisit

May 9, 2022
Fully featured, spec-compliant HTML5 server-sent events library

go-sse Lightweight, fully spec-compliant HTML5 server-sent events library. Table of contents go-sse Table of contents Installation and usage Implement

Dec 5, 2022
A concurrent rate limiter library for Golang based on Sliding-Window rate limiter algorithm.

ratelimiter A generic concurrent rate limiter library for Golang based on Sliding-window rate limitng algorithm. The implementation of rate-limiter al

Jan 6, 2023
The main goal of this code is to create a basic dnstap printing tool based on the golang-dnstap library.

dnstap-parse The main goal of this code is to create a basic dnstap printing tool based on the golang-dnstap library. The output is supposed to mimic

Nov 14, 2021
squirrelbyte is a "proof of concept" document / search server backed by sqlite.

??️ squirrelbyte is a "proof of concept" document / search server backed by sqlite.

May 20, 2022
Hotswap provides a solution for reloading your go code without restarting your server, interrupting or blocking any ongoing procedure.
Hotswap provides a solution for reloading your go code without restarting your server, interrupting or blocking any ongoing procedure.

Hotswap provides a solution for reloading your go code without restarting your server, interrupting or blocking any ongoing procedure. Hotswap is built upon the plugin mechanism.

Jan 5, 2023