Go - Interview Questions

Dear readers, these Go Programming Language Interview Questions have been designed specially to get you acquainted with the nature of questions you may encounter during your interview for the subject of Go Programming Language. As per my experience good interviewers hardly plan to ask any particular question during your interview, normally questions start with some basic concept of the subject and later they continue based on further discussion and what you answer:

Go is a general-purpose language designed with systems programming in mind.It was initially developed at Google in year 2007 by Robert Griesemer, Rob Pike, and Ken Thompson. It is strongly and statically typed, provides inbuilt support for garbage collection and supports concurrent programming. Programs are constructed using packages, for efficient management of dependencies. Go programming implementations use a traditional compile and link model to generate executable binaries.

Following are the benefits of using Go programming −

  • Support for environment adopting patterns similar to dynamic languages. For example type inference (x := 0 is valid declaration of a variable x of type int).

  • Compilation time is fast.

  • InBuilt concurrency support: light-weight processes (via goroutines), channels, select statement.

  • Conciseness, Simplicity, and Safety.

  • Support for Interfaces and Type embdding.

  • Production of statically linked native binaries without external dependencies.

No support for type inheritance.

No support for operator overloading.

No support for method overloading.

No support for pointer arithmetic.

No support for generic programming.

Yes! Go is a case sensitive programming language.

Static type variable declaration provides assurance to the compiler that there is one variable existing with the given type and name so that compiler proceed for further compilation without needing complete detail about the variable. A variable declaration has its meaning at the time of compilation only, compiler needs actual variable declaration at the time of linking of the program.

A dynamic type variable declaration requires compiler to interpret the type of variable based on value passed to it. Compiler don't need a variable to have type statically as a necessary requirement.

Yes Variables of different types can be declared in one go using type inference.

var a, b, c = 3, 4, "foo"  

Following code prints the type of a variable −

var a, b, c = 3, 4, "foo"  
fmt.Printf("a is of type %T\n", a)

It's a pointer variable which can hold the address of a variable.

For example −

var x = 5
var p *int
p = &x
fmt.Printf("x = %d", *p)

Here x can be accessed by *p.

break terminates the for loop or switch statement and transfers execution to the statement immediately following the for loop or switch.

continue causes the loop to skip the remainder of its body and immediately retest its condition prior to reiterating.

goto transfers control to the labeled statement.

The syntax of a for loop in Go programming language is −

for [condition |  ( init; condition; increment ) | Range] {

Here is the flow of control in a for loop −

  • if condition is available, then for loop executes as long as condition is true.

  • if for clause that is ( init; condition; increment ) is present then

    The init step is executed first, and only once. This step allows you to declare and initialize any loop control variables. You are not required to put a statement here, as long as a semicolon appears.

    Next, the condition is evaluated. If it is true, the body of the loop is executed. If it is false, the body of the loop does not execute and flow of control jumps to the next statement just after the for loop.

    After the body of the for loop executes, the flow of control jumps back up to the increment statement. This statement allows you to update any loop control variables. This statement can be left blank, as long as a semicolon appears after the condition.

    The condition is now evaluated again. If it is true, the loop executes and the process repeats itself (body of loop, then increment step, and then again condition). After the condition becomes false, the for loop terminates.

  • if range is available, then for loop executes for each item in the range.

The general form of a function definition in Go programming language is as follows −

func function_name( [parameter list] ) [return_types] {
   body of the function

A function definition in Go programming language consists of a function header and a function body. Here are all the parts of a function −

  • func func starts the declaration of a function.

  • Function Name − This is the actual name of the function. The function name and the parameter list together constitute the function signature.

  • Parameters − A parameter is like a placeholder. When a function is invoked, you pass a value to the parameter. This value is referred to as actual parameter or argument. The parameter list refers to the type, order, and number of the parameters of a function. Parameters are optional; that is, a function may contain no parameters.

  • Return Type − A function may return a list of values. The return_types is the list of data types of the values the function returns. Some functions perform the desired operations without returning a value. In this case, the return_type is the not required.

  • Function Body − The function body contains a collection of statements that define what the function does.

A Go function can return multiple values. For example −

package main
import "fmt"

func swap(x, y string) (string, string) {
   return y, x
func main() {
   a, b := swap("Mahesh", "Kumar")
   fmt.Println(a, b)

While calling a function, there are two ways that arguments can be passed to a function −

  • Call by value − This method copies the actual value of an argument into the formal parameter of the function. In this case, changes made to the parameter inside the function have no effect on the argument.

  • Call by reference − This method copies the address of an argument into the formal parameter. Inside the function, the address is used to access the actual argument used in the call. This means that changes made to the parameter affect the argument.

By default, Go uses call by value to pass arguments. In general, this means that code within a function cannot alter the arguments used to call the function and above mentioned example while calling max() function used the same method.

Go programming language provides flexibility to create functions on the fly and use them as values. We can set a variable with a function definition and use it as parameter to a function.

Functions closure are anonymous functions and can be used in dynamic programming.

Go programming language supports special types of functions called methods. In method declaration syntax, a "receiver" is present to represent the container of the function. This receiver can be used to call function using "." operator.

A local variable has default value as it corresponding 0 value.

A global variable has default value as it corresponding 0 value.

Pointer is initialized to nil.

Prints the formatted output.

The expression appearing on right side of the assignment operator is called as rvalue. Rvalue is assigned to lvalue, which appears on left side of the assignment operator. The lvalue should designate to a variable not a constant.

The parameters sent to the function at calling end are called as actual parameters while at the receiving of the function definition called as formal parameters.

Declaration associates type to the variable whereas definition gives the value to the variable.

Dividing the program in to sub programs (modules/function) to achieve the given task is modular approach. More generic functions definition gives the ability to re-use the functions, such as built-in library functions.

A Go program consists of various tokens and a token is either a keyword, an identifier, a constant, a string literal, or a symbol.


Array is collection of similar data items under a common name.

Go compiler assign a Nil value to a pointer variable in case you do not have exact address to be assigned. This is done at the time of variable declaration. A pointer that is assigned nil is called a nil pointer. The nil pointer is a constant with a value of zero defined in several standard libraries.

It's a pointer variable which can hold the address of another pointer variable. It de-refers twice to point to the data held by the designated pointer variable.

var a int
var ptr *int
var pptr **int
a = 3000
ptr = &a
pptr = &ptr
fmt.Printf("Value available at **pptr = %d\n", **pptr)

Therefore 'a' can be accessed by **pptr.

Structure is another user defined data type available in Go programming, which allows you to combine data items of different kinds.

To define a structure, you must use type and struct statements. The struct statement defines a new data type, with more than one member for your program. type statement binds a name with the type which is struct in our case.

The format of the struct statement is this −

type struct_variable_type struct {
   member definition;
   member definition;
   member definition;

Go Slice is an abstraction over Go Array. As Go Array allows you to define type of variables that can hold several data items of the same kind but it do not provide any inbuilt method to increase size of it dynamically or get a sub-array of its own. Slices covers this limitation. It provides many utility functions required on Array and is widely used in Go programming.

To define a slice, you can declare it as an array without specifying size or use make function to create the one.

var numbers []int /* a slice of unspecified size */
/* numbers == []int{0,0,0,0,0}*/
numbers = make([]int,5,5) /* a slice of length 5 and capacity 5*/

len() function returns the elements presents in the slice.

len() function returns the elements presents in the slice where cap() function returns the capacity of slice as how many elements it can be accomodate.

Slice allows lower-bound and upper bound to be specified to get the subslice of it using[lower-bound:upper-bound].

The range keyword is used in for loop to iterate over items of an array, slice, channel or map. With array and slices, it returns the index of the item as integer. With maps, it returns the key of the next key-value pair.

Go provides another important data type map which maps unique keys to values. A key is an object that you use to retrieve a value at a later date. Given a key and a value, you can store the value in a Map object. After value is stored, you can retrieve it by using its key.

You must use make function to create a map.

/* declare a variable, by default map will be nil*/
var map_variable map[key_data_type]value_data_type

/* define the map as nil map can not be assigned any value*/
map_variable = make(map[key_data_type]value_data_type)

delete() function is used to delete an entry from the map. It requires map and corresponding key which is to be deleted.

Type casting is a way to convert a variable from one data type to another data type. For example, if you want to store a long value into a simple integer then you can type cast long to int. You can convert values from one type to another using the cast operator as following −


Go programming provides another data type called interfaces which represents a set of method signatures. struct data type implements these interfaces to have method definitions for the method signature of the interfaces.

What is Next ?

Further you can go through your past assignments you have done with the subject and make sure you are able to speak confidently on them. If you are fresher then interviewer does not expect you will answer very complex questions, rather you have to make your basics concepts very strong.

Second it really doesn't matter much if you could not answer few questions but it matters that whatever you answered, you must have answered with confidence. So just feel confident during your interview. We at tutorialspoint wish you best luck to have a good interviewer and all the very best for your future endeavor. Cheers :-)