<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 10.2.1 結構體工廠 Go 語言不支持面向對象編程語言中那樣的構造子方法,但是可以很容易的在 Go 中實現 “構造子工廠“ 方法。為了方便通常會為類型定義一個工廠,按慣例,工廠的名字以 new 或 New 開頭。假設定義了如下的 File 結構體類型: ~~~ type File struct { fd int // 文件描述符 name string // 文件名 } ~~~ 下面是這個結構體類型對應的工廠方法,它返回一個指向結構體實例的指針: ~~~ func NewFile(fd int, name string) *File { if fd < 0 { return nil } return &File(fd, name) } ~~~ 然后這樣調用它: ~~~ f := NewFile(10, "./test.txt") ~~~ 在 Go 語言中常常像上面這樣在工廠方法里使用初始化來簡便的實現構造子。 如果?`File`?是一個結構體類型,那么表達式?`new(File)`?和?`&File{}`?是等價的。 這可以和大多數面向對象編程語言中笨拙的初始化方式做個比較:`File f = new File(...)`。 我們可以說是工廠實例化了類型的一個對象,就像在基于類的OO語言中那樣。 如果想知道結構體類型T的一個實例占用了多少內存,可以使用:`size := unsafe.Sizeof(T{})`。 **如何強制使用工廠方法** 通過應用可見性規則(參考第 4.2.1、9.5 節)就可以禁止使用 new 函數,強制用戶使用工廠方法,從而使類型變成私有的,就像在面向對象語言中那樣。 ~~~ type matrix struct { ... } func NewMatrix(params) *matrix { m := new(matrix) // 初始化 m return m } ~~~ 在其他包里使用工廠方法: ~~~ package main import "matrix" ... wrong := new(matrix.matrix) // 編譯失敗(matrix 是私有的) right := matrix.NewMatrix(...) // 實例化 matrix 的唯一方式 ~~~ ## [](https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/10.2.md#1022-map-和-struct-vs-new-和-make)10.2.2 map 和 struct vs new() 和 make() new 和 make 這兩個內置函數已經在第?[7.2.4](https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/07.2.md)?節通過切片的例子說明過一次。 現在為止我們已經見到了可以使用?`make()`?的三種類型中的其中兩個: ~~~ slices / maps / channels(見第 14 章) ~~~ 下面的例子來說明了在映射上使用 new 和 make 的區別,以及可能的發生的錯誤: 示例 10.4 new_make.go(不能編譯) ~~~ package main type Foo map[string]string type Bar struct { thingOne string thingTwo int } func main() { // OK y := new(Bar) (*y).thingOne = "hello" (*y).thingTwo = 1 // NOT OK z := make(Bar) // 編譯錯誤:cannot make type Bar (*y).thingOne = "hello" (*y).thingTwo = 1 // OK x := make(Foo) x["x"] = "goodbye" x["y"] = "world" // NOT OK u := new(Foo) (*u)["x"] = "goodbye" // 運行時錯誤!! panic: assignment to entry in nil map (*u)["y"] = "world" } ~~~ 試圖?`make()`?一個結構體變量,會引發一個編譯錯誤,這還不是太糟糕,但是?`new()`?一個映射并試圖使用數據填充它,將會引發運行時錯誤! 因為?`new(Foo)`?返回的是一個指向?`nil`?的指針,它尚未被分配內存。所以在使用?`map`?時要特別謹慎。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看