第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Golang:代碼重復(fù)和類似的結(jié)構(gòu)

Golang:代碼重復(fù)和類似的結(jié)構(gòu)

Go
幕布斯7119047 2021-11-15 15:47:13
Go to superclass 類似(但不相同)的數(shù)據(jù)類型以最小化代碼重復(fù)的慣用方法是什么?老生常談的例子:import "time"type LinuxUtmp struct {    ut_type uint16    _       [2]byte    ut_pid  uint32    ut_line [32]byte    ut_id   [4]byte    ut_user [32]byte    ut_host [256]byte    exit_status [2]uint32    tv_sec  uint32    tv_usec uint32    ...}func (l LinuxUtmp) User() string {    return string(l.ut_user[:])}func (l LinuxUtmp) Time() time.Time {    return time.Unix(int64(l.tv_sec), int64(l.tv_usec))}type BsdUtmp struct {    ut_line [8]char    ut_name [16]char    ut_host [16]char    ut_time uint32}func (b BsdUtmp) User() string {    return string(b.ut_user[:])}func (b BsdUtmp) Time() time.Time {    return time.Unix(int64(b.ut_time), 0)}顯然還有更多的東西,但我希望能夠以某種方式超類那些,所以我只需要編寫和維護(hù)特定函數(shù)的一個副本。接口似乎是“正確”的方式,但這還有很多不足之處(非工作示例):type Utmp interface {    Time() time.Time}func User(u Utmp) string {    return string(u.ut_user[:])}我也考慮過嵌入,但這似乎也是一個死胡同,因?yàn)?Go 的類型如此嚴(yán)格。我是否注定要擁有除簽名外在各方面都相同的多段代碼?[編輯]部分復(fù)雜之處在于我使用 encoding/binary.Read() 根據(jù)字節(jié)序解析這些數(shù)據(jù)(不僅僅是 utmp 記錄,而不僅僅是 Linux/BSD)。要使用它,字段必須按照它們在磁盤上的精確順序在結(jié)構(gòu)中[導(dǎo)出]。因此我不能只嵌入另一個結(jié)構(gòu)的字段,因?yàn)樵谀承┯涗浿兴鼈兊捻樞虿煌ú⑶掖笮〔煌?
查看完整描述

2 回答

?
蕭十郎

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個贊

我不明白您對嵌入的評論。這是我的方法(使用嵌入):


package test


import "time"


type Utmp struct {

    // Common fields

}


func (u Utmp) User() {

    return string(l.ut_user[:])

}


type LinuxUtmp struct {

    Utmp

    // Linux specific fields

}


func (l LinuxUtmp) Time() time.Time {

    return time.Unix(int64(l.tv_sec), int64(l.tv_usec))

}


type BsdUtmp struct {

    Utmp

    // BSD specific fields

}


func (b BsdUtmp) Time() time.Time {

    return time.Unix(int64(b.ut_time), 0)

}

任何導(dǎo)入庫的代碼都可以User()直接調(diào)用方法LinuxUtmp和BsdUtmp對象,l.User()無論b.User()是否提及Utmp。如果您愿意,您甚至可以保留Utmp出乎意料的 (as utmp)。


查看Effective Go了解詳情。


如果您愿意,您甚至可以確保只有適用于相關(guān)平臺的代碼才能在二進(jìn)制文件中編譯。這個博客有一些例子。為了保持簡單,如果特定于平臺的代碼不是很大或涉及其他因素,我不會費(fèi)心走這條路。


為了完整起見,這里是官方的go build文檔。


查看完整回答
反對 回復(fù) 2021-11-15
?
烙印99

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個贊

如果遇到某些東西類型不一樣的問題,可以讓TimeUser函數(shù)運(yùn)行在一個封裝了linux和bsd功能的接口上。

如果您不喜歡那樣,您可以生成代碼以避免重復(fù)。


查看完整回答
反對 回復(fù) 2021-11-15
  • 2 回答
  • 0 關(guān)注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號