Задать вопрос

Почему Go ругается на несоответствие одинаковых типов?

У меня есть такой код
var rLimit syscall.Rlimit
	if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
		panic(err)
	}
	rLimit.Cur = rLimit.Max
	if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
		panic(err)
	}

И тут есть странная ошибка. Она одна и та же в вызовах двух функций "syscall.Setrlimit" и "syscall.Getrlimit". Это ошибка звучит так
"Cannot use '&rLimit' (type *"syscall".Rlimit) as the type *"syscall".Rlimit".

Мне кажется или код ругается на то, что тип *"syscall".Rlimit не равен типу *"syscall".Rlimit".? В чём здесь ошибка?
  • Вопрос задан
  • 176 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@5465
Ошибка в этом коде вызвана тем, что в строке вызова syscall.Getrlimit после &rLimit стоит точка с запятой вместо закрывающей скобки.

Кроме того, ошибка в сообщении компилятора указывает на несоответствие типов указателей на Rlimit. Когда вы передаете &rLimit как аргумент для функции, она ожидает получить тип *Rlimit, а вы передаете тип **Rlimit, то есть указатель на указатель на Rlimit.

Чтобы исправить ошибку, вам нужно передать адрес rLimit (тип *Rlimit) вместо &rLimit (тип **Rlimit) при вызове функций syscall.Getrlimit и syscall.Setrlimit. Вот исправленный код:

var rLimit syscall.Rlimit
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
    panic(err)
}
rLimit.Cur = rLimit.Max
if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
    panic(err)
}


Обратите внимание, что при вызове syscall.Getrlimit мы передаем адрес &rLimit, а не rLimit, так как функция ожидает указатель на Rlimit. Но когда мы передаем &rLimit в качестве аргумента для syscall.Setrlimit, мы передаем указатель на Rlimit, поэтому не нужно использовать оператор взятия адреса &.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы