【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}
}