亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

即使結構未導出,您可以使用結構的類型定義嗎?

即使結構未導出,您可以使用結構的類型定義嗎?

Go
慕婉清6462132 2022-06-06 15:47:18
我目前正在使用 New() 函數來創建我所有的新 Person 結構。我還在另一個包中使用 Person 類型作為另一個函數的返回值。有沒有辦法讓 Person 結構不被導出,但也能夠在其他包中只使用結構的類型定義?提前致謝!:)package modelstype Person struct {    Username string    Email    string}func New() Person{    return Person{}}package testfunc test() models.Person{    ...}
查看完整描述

1 回答

?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

似乎 Person 結構可以不導出并用作函數的返回值而不會收到以下錯誤:cannot refer to unexported name person.person.


但是,您可以創建一個從New()函數返回的 Person 接口,該函數返回實現該接口的未導出人員結構:


package models


type Person interface {

    GetUsername() string

    GetEmail() string

}

type person struct {

    Username string

    Email    string

}

func (p person) GetUsername() string {

    return p.Username

}

func (p person) GetEmail() string {

    return p.Email

}

func New() Person{

    return person{}

}

然后測試包可以使用該接口作為其返回值:


package test


func test() person.Person {

    return person.New()

}

你有什么特別的理由想這樣做嗎?您將在慣用的 Go 代碼中看到的常見模式如下所示:


// person.go

package person


// Person ...

type Person struct {

    Username string

    Email    string

}


// New ...

func New() Person {

    return Person{

        Username: "username",

        Email:    "email",

    }

}



// person_test.go

package person


import "testing"


func TestNew(t *testing.T) {

    p := New()

    if p.Username != "something" {

        t.Error("error")

    }

}

Person 結構及其測試包含在同一個包中,并且 Person 是一個導出的結構,它避免了以下 go-lint 警告:exported func New returns unexported type person.person, which can be annoying to use


查看完整回答
反對 回復 2022-06-06
  • 1 回答
  • 0 關注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號