Функция os.Getgid

Функция os.Getgid возвращает целочисленный идентификатор группы (GID) текущего процесса. Этот идентификатор используется операционной системой для определения прав доступа процесса к файлам и другим ресурсам. Функция не принимает никаких параметров и всегда возвращает значение типа int. Важно отметить, что функция доступна только в Unix-подобных системах и не поддерживается в Windows.

Синтаксис

goos.Getgid()

Пример

Давайте получим идентификатор группы текущего процесса и выведем его на экран:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  gid := os.Getgid()
  fmt.Println("Group ID:", gid)
}

Результат выполнения кода:

go"Group ID: 1000"

Пример с проверкой прав доступа

Давайте используем идентификатор группы для проверки прав доступа к файлу. В этом примере мы сравниваем GID текущего процесса с владельцем группы файла:

gopackage main

import (
  "fmt"
  "os"
  "os/user"
)

func main() {
  // Получаем GID текущего процесса
  gid := os.Getgid()

  // Получаем информацию о текущем пользователе
  currentUser, err := user.Current()
  if err != nil {
    fmt.Println("Error getting user info:", err)
    return
  }

  // Получаем информацию о группе пользователя
  group, err := user.LookupGroupId(currentUser.Gid)
  if err != nil {
    fmt.Println("Error getting group info:", err)
    return
  }

  fmt.Printf("Process GID: %d\n", gid)
  fmt.Printf("User's primary group: %s (%s)\n", group.Name, group.Gid)
}

Результат выполнения кода:

go"Process GID: 1000"
"User's primary group: users (1000)"

Пример с проверкой дополнительных групп

Давайте получим список всех групп, к которым принадлежит текущий пользователь, и проверим, входит ли в них основной GID процесса:

gopackage main

import (
  "fmt"
  "os"
  "os/user"
  "strconv"
)

func main() {
  // Получаем GID текущего процесса
  gid := os.Getgid()

  // Получаем информацию о текущем пользователе
  currentUser, err := user.Current()
  if err != nil {
    fmt.Println("Error getting user info:", err)
    return
  }

  // Получаем список дополнительных групп пользователя
  groupIds, err := currentUser.GroupIds()
  if err != nil {
    fmt.Println("Error getting group IDs:", err)
    return
  }

  fmt.Printf("Process GID: %d\n", gid)
  fmt.Println("User's group memberships:")

  for _, gidStr := range groupIds {
    groupId, _ := strconv.Atoi(gidStr)
    group, err := user.LookupGroupId(gidStr)
    if err == nil {
      fmt.Printf("  - Group ID %d (%s)\n", groupId, group.Name)
    } else {
      fmt.Printf("  - Group ID %d\n", groupId)
    }
  }
}

Результат выполнения кода:

go"Process GID: 1000"
"User's group memberships:"
"  - Group ID 1000 (users)"
"  - Group ID 1001 (developers)"
"  - Group ID 1002 (admin)"

Смотрите также

  • функцию os.Getuid,
    которая возвращает идентификатор пользователя текущего процесса
  • функцию os.Getpid,
    которая возвращает идентификатор текущего процесса
  • функцию os.Getppid,
    которая возвращает идентификатор родительского процесса
  • функцию os.Hostname,
    которая возвращает имя хоста системы