Golang 的相关总结

指针

C/C++的指针有点不同。

C/C++の値C/C++のポインタgolangの値golangのポインタポインタの取り方&val
&val
フィールド(メンバ)へのアクセスval.memberptr->memberval.fieldptr.fieldポインタ演算
あり
なし参照外し
*ptr
*ptrダブルポインタ
&ptr
&ptr

如果隐式类型转换和类型推断不起作用

我觉得我在这里完全误解了,所以我会删除它。

方法

package main

type Hoge struct {}

func (h Hoge)  value() {}
func (h *Hoge) pointer() {}

func main() {
    val := Hoge{}
    ptr := &val
}

假设有这样的代码,val、ptr 和 .value()、.pointer() 的调用组合如下。

valptr.value()okok.pointer()okok

调用其他的方法

可以像上面网址所示的那样,以以下方式调用该方法。

package main

type Hoge struct {}

func (h Hoge)  value() {}
func (h *Hoge) pointer() {}


func main() {
    val := Hoge{}

    fv := Hoge.value
    fv(val)

    fp := (*Hoge).value
    fp(&val)
}

Hoge, Hoge的.value和.pointer的提取组合如下

Hogeそのときの型*Hogeそのときの型.valueokfunc(Hoge)okfunc(*Hoge).pointerng
okfunc(*Hoge)

接口

以下代码将导致编译错误。

package main


type Testable interface {
    test()
}


type Model struct {}
func (m *Model) test() {}


func main() {
    val := Model{}
    ptr := &val

    var tester Testable
    tester = ptr // こっちは通る
    tester = val // こっちはダメ

    _ = tester
}

这似乎是因为val是Model类型,而且实现了Testable接口,所以不行。

val, ptr和实现方的组合如下

valptrfunc (m *Model)ngokfunc (m Model)okok

接口指针

以下是两个链接的原汁原味的中文释义:

http://qiita.com/suin/items/68ed7020d21dca047a73
这是一篇讲述如何通过Shell脚本提高生产力的文章。

http://qiita.com/zetamatta/items/62645bb9ad8d4cf37acb
这是一篇关于在Windows上使用Emacs的技巧的文章。

以下的代码无法通过编译,会报错。

package main

type Testable interface {
    test()
}

func doit(t *Testable) {
    t.test()
}

func main() {
}

如果非要使用*Testable的话

package main

type Testable interface {
    test()
}

func doit(t *Testable) {
    (*t).test()
}

func main() {
}

如果像那样先暂时取消引用一次,就能通过。

广告
将在 10 秒后关闭
bannerAds