Skip to content

Instantly share code, notes, and snippets.

@changtimwu
Created July 26, 2014 02:20
Show Gist options
  • Save changtimwu/e712fbb47bce717407a0 to your computer and use it in GitHub Desktop.
Save changtimwu/e712fbb47bce717407a0 to your computer and use it in GitHub Desktop.
git mutable type study

struct 真的是copy value , 要用 pointer 才能指到同一個 struct variable

package main

import "fmt"

type myst struct {
	age int
}

var thest myst = myst{age: 1}

func getstp() *myst {
	return &thest
}

func getst() myst {
	return thest
}

func main() {
	for i := 0; i < 10; i++ {
		st := getst()
		fmt.Println(st)
		st.age--
	}
	fmt.Println("with pointer")
	for i := 0; i < 10; i++ {
		stp := getstp()
		fmt.Println(*stp)
		stp.age--
	}

}
@changtimwu
Copy link
Author

map 不必特別用 pointer, 這種collection type, assignment其實都是 change reference

var callback_seq map[string]int = map[string]int{"$": 0}

func getseqp() *map[string]int {
    callback_seq["$"]++
    return &callback_seq
}

func getseq() map[string]int {
    callback_seq["$"]++
    return callback_seq
}
func main() {
    for i := 0; i < 10; i++ {
        seq := getseq()
        fmt.Println(seq)
        seq["$"]--
    }
}    

@changtimwu
Copy link
Author

slice 跟 map一樣都是 reference

package main

import "fmt"

var thesl = []int{1, 2, 3, 4, 5}

func getslp() *[]int {
    return &thesl
}

func getsl() []int {
    return thesl
}

func main() {
    for i := 0; i < 10; i++ {
        sl := getsl()
        fmt.Println(sl)
        sl[0]--
    }
}

@changtimwu
Copy link
Author

array 跟 slice 不一樣

package main

import "fmt"

/* accept ary as a slice */
func tary1(ary []int) {
    ary[0] += 1
}

/* accept ary as an array.  Value are copied. */
func tary2(ary [5]int) {
    ary[1] += 1
}

func main() {
    ary := [5]int{51, 52, 53, 54, 55}
    fmt.Println("origin:", ary)
    tary2(ary)
    fmt.Println("after ary change:", ary)
    tary1(ary[:])
    fmt.Println("after slice change:", ary)

}

@changtimwu
Copy link
Author

array 就是 copy value 了, 如果改call getaryp , 效果又可以跟 slice 一樣了

package main

import "fmt"

var theary = [5]int{1, 2, 3, 4, 5}

func getaryp() *[5]int {
    return &theary
}

func getary() [5]int {
    return theary
}

func main() {
    for i := 0; i < 10; i++ {
        ary := getary()
        fmt.Println(ary)
        ary[0]--
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment