【Golang】newとmakeの違い

Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

package main
//new makeの違い
//new メモリーにポインタが入る空の領域を確保したい場合
//ここ調査

import (
    "fmt"
)


type Person struct{
    id int
    name string
}

func main() {
    //アドレスだけ付与する
    var p *int = new(int)
    fmt.Println(p)
    //>>0xc000016068
    fmt.Println(**&p)
    //>>0
    fmt.Println(*p)
    //>>0

    //メモリーはあるので、(0なので)カウントアップする
    *p++
    fmt.Println(*p)


    //まだアドレスがない
    /*
        var p2 *int
        fmt.Println(p2)
        //>>nil

        //アドレスはnilなのでエラーになる
        *p2++
        fmt.Println(p2)
    */



    //newとmakeの違い
    //newはポインタを返す
    //makeは空を返す
    //スライス、マップ、チャネルはmake
    //変数、structはnew 
    //で使い分ける

    s := make([]int, 0)
    fmt.Println(s)
    //>>[]
    fmt.Printf("%T\n", s)//型を表示


    m := make(map[string]int)
    fmt.Println(m)
    //>>map[]
    fmt.Printf("%T\n", m)


    ch := make(chan int)
    fmt.Println(ch)
    //>>0xc00005c060

    //new
    //変数
    var p2 *int = new(int)
    //*int 
    fmt.Printf("%T\n", p2)
    //>>*int

    //struct
    var st = new(struct{})
    fmt.Println(st)
    //>>&{}
    fmt.Printf("%T\n", st)
    //*struct {}



    //newと&
    //動作上違いはあまりない
    man := new(Person)
    man.id = 0
    man.name = "genius"
    fmt.Println(man)
    //>>&{0 genius}

    woman := &Person{id:1, name:"nancy"}
    fmt.Println(woman)
    //>>&{1 nancy}
}
广告
将在 10 秒后关闭
bannerAds