Сравнение значения переменной указателя nil - PullRequest
1 голос
/ 20 мая 2011

Я знаю, что Go немного отличается от других языков в этом отношении, но мне было интересно, стоит ли для языка Go автоматически проверять нулевые указатели при сравнении и возвращать неравный, если только одно из значений равно nilсравнение), а не создание ошибки во время выполнения.Го так хорош во многих областях, я просто думал, что это может сделать.Данный случай выглядит следующим образом:


type cuForm struct {sName string; iUseCount int64; baForm []byte}

var pugForm *cuForm

//***********************************************************
func loadForm (sWanted string) (*cuForm, os.Error) {
//***********************************************************

    if (sWanted == pugForm.sName) {

В приведенном выше примере, если pugForm равен nil, возникает ошибка во время выполнения.Очевидно, что если только одно из значений равно nil, оно не может быть равным - по крайней мере, логически.Вполне может быть причина, почему этого не следует делать, но я не думаю, что история должна быть одной из причин.

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Сообщение об ошибке: «паника: ошибка во время выполнения: неверный адрес памяти или разыменование нулевого указателя». Фактическая ошибка - разыменование нулевого указателя.

Когда указатель pugForm равен nil, тогда pugForm.sName не определен. Вы хотите, чтобы это было специальное значение, например, null в SQL или NaN в плавающей точке. Теперь вам нужен специальный набор правил для всех операций, а не только равенство.

Разыменование нулевого указателя почти всегда неверно. Среда выполнения должна возражать, если это произойдет. Если это не так, избегайте проблемы, проверяя на ноль. Исправьте ошибку, не пытайтесь сделать вид, что этого не произошло.

Какой вывод вы ожидаете от этой программы?

package main

import (
    "fmt"
)

func main() {
    var i int
    var p *int
    var b bool
    b = i == *p
    b = i <= *p
    b = i >= *p
    i += *p
    i -= *p
    i *= *p
    i /= *p
    i %= *p
    i = *p << uint(i)
    i = *p >> uint(i)
    fmt.Println(i, p, b)
}
0 голосов
/ 20 мая 2011

Не говоря о том, что ваш вопрос не уместен, я вижу вескую причину не реализовывать это в качестве компиляции по умолчанию: это означает больше тестов во время выполнения, и я не хочу этого для всех тестов на равенство моих программ. *

Но это правда, что выделенное выражение (например, что-то вроде '===') может (возможно) быть полезным.

Как сказал Нос, список рассылки сумасшедших, вероятно, будет более конструктивным местом для этой дискуссии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...