1. У модуля может быть много пакетов. Виден ли идентификатор, определенный в одном пакете, в другом пакете?
    В отличие от других языков, которые предоставляют ключевые слова для определения видимости идентификатора, Golang упростил его, используя начальную букву имени идентификатора.
    Если начальная буква — заглавная, идентификатор экспортируется автоматически.

2. Поддерживает ли GoLang передачу по ссылке?
Каналы, карты и срезы по умолчанию являются ссылками для передачи, остальные объекты являются значениями для передачи.
Массивы в Golang передаются по значению.

3. Есть ли в Go универсальный тип данных?
Интерфейс объявляет набор методов, которые позволяют пользовательскому типу определять методы и получать доступ к атрибутам.
С методами, объявленными в интерфейсе, объекты может получить доступ к атрибутам.

Пустой интерфейс — это универсальный тип данных, т. е. interface{}

Пример:

func displayBlogDetails(blog interface{}) {
    fmt.Println(blog)
}

Чтобы получить доступ к атрибутам из универсального типа данных, мы должны сначала привести к определенному типу и получить доступ, поскольку интерфейс не имеет объявленных методов.

4. Блокируют ли буферизованные каналы подпрограммы при доступе к данным?
Ну, в буферизованных каналах при записи данных подпрограммы не блокируются до тех пор, пока кто-то не прочитает, но при чтении, если данные недоступны, до тех пор, пока подпрограмма извлекает данные, она будет заблокирована.

5. Безопасны ли подпрограммы (потоки) каналов?
Да, каналы используются для синхронизации подпрограмм, где каналы совместно используются подпрограммами. Нам не нужно явно использовать блокировки Mutex для синхронизации.

  package main
  import "fmt"
  import "sync"

  func streamData() chan int {
      mychannel := make(chan int, 20)
      var wg sync.WaitGroup
      wg.Add(2)
      go func(nchannel chan int) {
          counter := 0
          for {
              if counter == 20 {
                  break
              }
              counter = counter + 1
              nchannel <- counter
          }
          wg.Done()
      }(mychannel)
      
      go func(nchannel chan int) {
          counter := 100
          for {
              if counter == 120 {
                  break
              }
              counter = counter + 1
              nchannel <- counter
          }
          wg.Done()
      }(mychannel)
      
      go func(nchannel chan int) {
          wg.Wait()
          close(nchannel)
      }(mychannel)
      
      return mychannel
  }

  func main() {
      var wg sync.WaitGroup
      dataStream := streamData()
      wg.Add(1)
      go func() {
          for elem:= range(dataStream) {
              fmt.Println("First",elem)
          }
          wg.Done()
      }()

      wg.Add(1)    
      go func() {
          for elem:= range(dataStream) {
              fmt.Println("Second", elem)
          }
          wg.Done()
      }()
      wg.Wait()
  }

6. Каковы все способы объявления/инициализации переменных в Golang?
1. var ‹имя-переменной› ‹тип-данных›
2. ‹имя-переменной› : = ‹значение›
3. var ‹имя-переменной› = ‹значение›

Пример:

var myblog Blog

myblog := Blog {
    Title : "Introduction to Go Programming",
    Author: "Ganesh Kandula",
    Content: "Go is a powerful and efficient programming language…",
    Published: true, 
    Tags: []string{"Go", "Programming", "Beginner",
}

var myblog = Blog {
    Title : "Introduction to Go Programming",
    Author: "Ganesh Kandula",
    Content: "Go is a powerful and efficient programming language…",
    Published: true, 
    Tags: []string{"Go", "Programming", "Beginner",
}

Когда что использовать?
Когда мы хотим объявить переменную, используем первый метод, где мы указываем тип переменной без инициализации.

Используйте второй способ, когда мы хотим инициализировать переменную во время объявления, т.е. в этом методе одна и та же строка выполняет и объявление, и инициализацию.

7. Является ли Golang статически типизированным языком?
Да, Golang — это статически типизированный язык, в котором переменные явно объявляются с определенным типом во время компиляции, и после того, как тип указан, его нельзя изменить. изменяется во время выполнения путем присвоения различных значений типа.

8. Рекомендуется ли, чтобы все файлы Go, принадлежащие одному и тому же пакету, находились в одной папке?
Да, в Go принято упорядочивать все файлы Go, принадлежащие пакет в папке, которая названа в честь пакета. Это соглашение помогает обеспечить согласованную и предсказуемую организацию пакетов в проектах и ​​облегчает навигацию и понимание кодовой базы.

Хотя сам язык Go строго не соблюдает его, отклонение от этого соглашения может привести к путанице, затруднить поиск файлов и управление ими, а также может привести к ошибкам сборки или проблемам с системой импорта.

Рекомендуется следовать соглашению о размещении всех файлов Go пакета в папке с именем пакета. Это способствует организации кода, повышает удобство сопровождения и соответствует ожиданиям других разработчиков, которые могут работать с кодовой базой или взаимодействовать с ней.

9. Поддерживает ли Golang наследование?
Если говорить строго, нет, Golang не поддерживает наследование, но мы можем добиться того же поведения, что и наследование в Golang, с помощью встраивания.

package main

import "fmt"

// Embedded struct: Author
type Author struct {
    Name  string
    Email string
}

// Embedding struct: BlogPost
type BlogPost struct {
    Title  string
    Author // Embedded Author struct
    Content string
}

// Method defined on the BlogPost struct
func (bp BlogPost) Display() {
    fmt.Printf("Title: %s\n", bp.Title)
    fmt.Printf("Author: %s (%s)\n", bp.Name, bp.Email)
    fmt.Printf("Content: %s\n", bp.Content)
    fmt.Println("-------------------")
}

func main() {
    // Create a BlogPost instance
    blogPost := BlogPost{
        Title: "Introduction to Embedding in Go",
        Author: Author{
            Name:  "Ganesh",
            Email: "[email protected]",
        },
        Content: "This is a blog post about embedding in Go.",
    }

    // Access embedded struct fields directly
    fmt.Println("Author Name:", blogPost.Name)
    fmt.Println("Author Email:", blogPost.Email)

    // Call method on the embedding struct
    blogPost.Display()
}