What (exactly) does the type keyword do in go?

It's used to define a new type.

General format:
type <new_type> <existing_type or type_definition>

Common use cases:

  • Create a new type for an existing type.
    Format:
    type <new_type> <existing_type>
    e.g
    type Seq []int
  • Create a type while defining struct.
    Format:
    type <new_type> struct { /*...*/}
    e.g
    https://gobyexample.com/structs
  • Define function type, (aka. by assigning name to a function signature).
    Format:
    type <FuncName> func(<param_type_list>) <return_type>
    e.g
    type AdderFunc func(int, int) int

In your case:

It define a type named Vertex for a new struct, so that later you can refer to the struct via Vertex.


Actually type keyword is same with class topology in PHP.

With type keyword as though you create class in GO

Example type in struct

type Animal struct {
  name string //this is like property
}

func (An Animal) PrintAnimal() {
  fmt.Println(An.name) //print properties
}

func main() {
  animal_cow := Animal{ name: "Cow"} // like initiate object

  animal_cow.PrintAnimal() //access method
}

OK let's move with type string (is same for int or float)

   type Animal string
        
   // create method for class (type) animal
   func (An Animal) PrintAnimal() {
      fmt.Println(An) //print properties
   }
    
   func main(){
      animal_cow := Animal("Cow") // like initiate object
    
      animal_cow.PrintAnimal() //access method
      //Cow
   }

Difference between struct and string, int, float just in struct you can add more properties with any different data type

Opposite in string, int, float you can only have 1 properties, which created when you initiate your type (ex: animal_cow := Animal("Cow")

But, all type which build using type keyword can definitely have more than 1 method

Correct me if I am wrong


The type keyword is there to create a new type. This is called type definition. The new type (in your case, Vertex) will have the same structure as the underlying type (the struct with X and Y). That line is basically saying "create a type called Vertex based on a struct of X int and Y int".

Don't confuse type definition with type aliasing. When you declare a new type, you are not just giving it a new name - it will be considered a distinct type. Take a look at type identity for more information on the subject.