# Structs

This Go program demonstrates the usage of structs, creating instances of a struct, initializing struct fields, and working with pointers to structs.

Let's go through each part of the code with inline comments and additional explanations:

```go
package main

import "fmt"

// Define a struct named 'person' with two fields: 'name' of type string and 'age' of type int
type person struct {
    name string
    age  int
}

// Function newPerson creates and initializes a new person, setting the name and age, and returns a pointer to the person struct
func newPerson(name string) *person {
    p := person{name: name}
    p.age = 42
    return &p
}

func main() {
    // Create an instance of the person struct with field values "Bob" and 20, and print it
    fmt.Println(person{"Bob", 20})

    // Create an instance of the person struct with named field values, "Alice" and 30, and print it
    fmt.Println(person{name: "Alice", age: 30})

    // Create an instance of the person struct with a named field value, "Fred," and print it
    fmt.Println(person{name: "Fred"})

    // Create an instance of the person struct using the newPerson function, setting the name to "Ann" and age to 40, and print it
    fmt.Println(newPerson("Ann"))

    // Create an instance of the person struct using the newPerson function, setting the name to "Jon", and print it
    fmt.Println(newPerson("Jon"))

    // Create an instance of the person struct with field values "Sean" and 50
    s := person{name: "Sean", age: 50}

    // Access and print the 'name' field of the person struct
    fmt.Println(s.name)

    // Create a pointer to the person struct
    sp := &s

    // Access and print the 'age' field of the person struct using a pointer
    fmt.Println(sp.age)

    // Modify the 'age' field of the person struct using the pointer
    sp.age = 51

    // Print the modified 'age' field of the person struct
    fmt.Println(sp.age)

    // Create an instance of an anonymous struct representing a dog and print it
    dog := struct {
        name   string
        isGood bool
    }{
        "Rex",
        true,
    }
    fmt.Println(dog)
}
```

#### Output

```
{Bob 20}
{Alice 30}
{Fred 0}
&{Ann 40}
&{Jon 42}
Sean
50
51
{Rex true}
```

Explanation:

1. A `person` struct is defined with two fields: `name` of type string and `age` of type int.
2. The `newPerson` function creates and initializes a new person, setting the name and age, and returns a pointer to the person struct.
3. In the `main` function:
   * Instances of the `person` struct are created with different field values and printed.
   * The `newPerson` function is used to create instances with default values and print them.
   * Field values of an instance are accessed and printed.
   * A pointer to a `person` struct is created and used to access and modify field values.
   * An anonymous struct representing a dog is created and printed.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ineelhere.gitbook.io/code-with-go/19-structs.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
