# package pkg

Package pkg has every form of declaration.

### Heading {#hdr-Heading}

Search [Google](https://google.com) for details.

### Links {#hdr-Links}

  - pkgsite repo, [https://go.googlesource.com/pkgsite](https://go.googlesource.com/pkgsite)
  - Play with Go, [https://play-with-go.dev](https://play-with-go.dev)

#### Example

```go
{
	fmt.Println("Package example")

}
```
Output:

```
Package example

```

## Constants

```go
const (
	X = 1
	Y = 2
)
```
Several constants.

```go
const C = 1
```
C is a shorthand for 1.

## Variables

```go
var V = 2
```
V is a variable.

## Functions

```go
func Add(x int) int
```
Add adds 1 to x.

```go
func F()
```
F is a function.

#### Example

```go
{
	pkg.F()
	fmt.Println("F example")

}
```
Output:

```
F example

```

#### Example (second)

```go
{
	pkg.F()
	fmt.Println("F second example")

}
```
Output:

```
F second example

```

## Types

```go
type A int
```

```go
type B bool
```

```go
type I1 interface {
	M1()
}
```
I1 is an interface.

```go
type I2 interface {
	I1
	M2()
}
```

```go
type S1 struct {
	F int // field
}
```
S1 is a struct.

```go
type S2 struct {
	S1
	G int
}
```
S2 is another struct.

```go
type T int
```
T is a type.

#### Example

```go
{
	_ = pkg.T(0)
	fmt.Println("T example")

}
```
Output:

```
T example

```

```go
const CT T = 3
```
CT is a typed constant. They appear after their type.

```go
func TF() T
```
TF is a constructor for T.

```go
func (T) M()
```
M is a method of T. BUG(xxx): this verifies that notes are rendered.

#### Example

```go
{
	var t pkg.T
	t.M()
	fmt.Println("M example")

}
```
Output:

```
M example

```
