3

当我通过公共函数公开私有类型时,我正在测试 go 的类型可见性并收到意外行为:

package pak

type foo struct { // shoudn't be visible to any other package than pak
    Bar string
}

func NewFoo(str string) *foo {
    return &foo{str}
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package main

import (
    "fmt"
    "pak"
)

func main() {
    // these lines should be equivalent...
    var f = pak.NewFoo("Hello, World!")         // this works fine...   
    var f *pak.foo = pak.NewFoo("Hello, World!") // ERROR: cannot refer to unexported name pak.foo

    fmt.Printf("%T\n", f)
    fmt.Printf("%s\n", f.Bar)  // how does it know about .Bar, if it can't see pak.foo?
}

没有明确声明 的类型f,它会打印:

*pak.foo
Hello, World!

*pak.foo它无法编译。

为什么在这两种情况下都不会失败?

(这个问题有点相关,但它没有回答这个问题)

4

1 回答 1

3

有效的声明

var f = pak.NewFoo("test")

为您提供一个匿名的隐藏地址struct foo。您不能使用它来读取或写入包struct foo外部pak。您可以并且通常会使用它来调用pak包方法。例如,

p := f.PakMethod()

无效的声明

var f *pak.foo = pak.NewFoo("test")

尝试获取struct foo. struct foo如果允许,这将允许您从包外部读取和写入pak

于 2013-03-27T20:12:26.773 回答