To create a web server in Go, you can use the http package provided by the standard library. This package includes the http.Server type, which represents an HTTP server, and the http.ListenAndServe() function, which listens for incoming HTTP requests on a specified port and serves responses to those requests.

Here is an example of how you might create a simple web server in Go:

// Import the http package
import "net/http"

// Define a function that will be called to handle incoming HTTP requests
func handler(w http.ResponseWriter, r *http.Request) {
    // Write a response message to the client
    fmt.Fprintf(w, "Hello, World!")
}

func main() {
    // Set up a route that will call the handler function for any requests to the root URL
    http.HandleFunc("/", handler)

    // Start the web server and listen for incoming requests on port 8080
    http.ListenAndServe(":8080", nil)
}

In this example, the handler() function is defined to handle incoming HTTP requests. This function receives a http.ResponseWriter and a *http.Request as arguments, which are used to write the response message and access information about the incoming request, respectively. The main() function sets up a route that will call the handler() function for any requests to the root URL ("/") and then starts the web server using the http.ListenAndServe() function. This web server will listen for incoming requests on port 8080 and serve responses using the handler() function.

This is a very basic example of how to create a web server in Go. You can customize the handler() function and add additional routes to handle different URL paths and HTTP methods as needed. You can also configure the http.Server object to customize the behavior of the web server, such as setting timeouts or enabling TLS.

More often, if you are building microservices, you probably want to handle JSON input/output.

To handle JSON input and output in a web server in Go, you can use the encoding/json package to encode and decode JSON data. This package provides the json.Marshal() and json.Unmarshal() functions, which can be used to convert between JSON data and Go data types.

Here is an example of how you might handle JSON input and output in a web server in Go:

// Import the encoding/json and net/http packages
import (
    "encoding/json"
    "net/http"
)

// Define a struct that will be used to hold the JSON data
type Message struct {
    Text string `json:"text"`
}

// Define a function that will be called to handle incoming HTTP requests
func handler(w http.ResponseWriter, r *http.Request) {
    // Check the HTTP method of the request
    switch r.Method {
    case "POST":
        // If the request is a POST request, read the JSON data from the request body
        var m Message
        if err := json.NewDecoder(r.Body).Decode(&m); err != nil {
            // If there is an error decoding the JSON data, respond with an error message
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }

        // Do something with the JSON data (in this case, just print it to the console)
        fmt.Println(m.Text)

        // Respond with a JSON message
        json.NewEncoder(w).Encode(&Message{Text: "Hello from the server!"})
    default:
        // If the request is not a POST request, respond with an error message
        http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
    }
}

func main() {
    // Set up a route that will call the handler function for any requests to the root URL
    http.HandleFunc("/", handler)

    // Start the web server and listen for incoming requests on port 8080
    http.ListenAndServe(":8080", nil)
}

In this example, the handler() function is defined to handle incoming HTTP requests. This function checks the HTTP method of the request and, if it is a POST request, it uses the json.NewDecoder() function to read the JSON data from the request body and decode it into a Message struct. The Message struct includes a json:“text” tag, which specifies the field name to use in the JSON data. This tag is used by the json package to map the JSON data to the corresponding fields in the Message struct.

If the request is a POST request, the handler() function does something with the JSON data (in this case, just printing it to the console) and then responds with a JSON message using the json.NewEncoder() function. This function encodes the Message struct as JSON and writes it to the http.ResponseWriter object, which sends the response to the client.

This is a simple example of how to handle JSON input and output in a web server in Go. You can customize the handling of the JSON data and the response message as needed, depending on the requirements of your application.