Можно ли изменять неимпортируемые поля структуры в других пакетах программы?

В языке Go доступ к полям структуры определяется в основном видимостью полей и пакетов, которые используют эти структуры.

Структуры в Go могут иметь публичные (экспортируемые) и приватные (непубличные) поля. Публичные поля начинаются с заглавной буквы и могут быть доступны из других пакетов, в то время как приватные поля начинаются со строчной буквы и доступны только внутри пакета, где они объявлены.

Переменная структуры с приватными полями не может быть напрямую изменена из другого пакета, так как к ним нет доступа. Однако, могут быть определены методы-геттеры и методы-сеттеры для изменения и получения значений приватных полей структуры из другого пакета. Методы-геттеры могут позволить получить значения приватного поля, а методы-сеттеры - установить новое значение.

Вот пример:

package package1

type MyStruct struct {
    privateField int
    PublicField  string
}

func (s *MyStruct) GetPrivateField() int {
    return s.privateField
}

func (s *MyStruct) SetPrivateField(value int) {
    s.privateField = value
}
package package2

import (
    "package1"
    "fmt"
)

func main() {
    myStruct := package1.MyStruct{}
    myStruct.PublicField = "Hello" // Можно изменить публичное поле
    
    // myStruct.privateField = 10 // Ошибка компиляции, так как privateField недоступен

    // можно получить значение privateField с помощью метода-геттера
    privateFieldValue := myStruct.GetPrivateField()
    fmt.Println(privateFieldValue) // Выведет 0 (значение по умолчанию)

    // можно изменить значение privateField с помощью метода-сеттера
    myStruct.SetPrivateField(5)
    privateFieldValue = myStruct.GetPrivateField()
    fmt.Println(privateFieldValue) // Выведет 5
}

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