Разыменование указателей в Go - PullRequest
4 голосов
/ 05 марта 2010

Я не понимаю, почему строка 15 недействительна. Почему указатель на большой не может быть разыменован, в то время как указатель на int может?

package main

import (
    "fmt"
    "big"
)

func main() {
    var c *int = getPtr()
    fmt.Println(c)
    fmt.Println(*c)

    var d *big.Int = big.NewInt(int64(0))
    fmt.Println(d)

    // does not compile - implicit assignment of big.Int
    // field 'neg' in function argument
    //fmt.Println(*d)
}

func getPtr() *int {
    var a int = 0
    var b *int = &a
    return b
}

1 Ответ

5 голосов
/ 05 марта 2010

Это потому, что Int - это структура с неэкспортированными полями. Когда вы передаете структуру по значению функции, вы создаете ее копию. Спецификация Go гласит, что это допустимо

... либо все поля T должны быть экспортировано, или назначение должно быть в тот же пакет, в котором Т объявлен. Другими словами, структура значение может быть присвоено структуре переменная, только если каждое поле структура может быть юридически назначена индивидуально по программе.

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