跳坑golang

新手坑

  • 坑一
    问题:写第一个hello world,编辑器自动生成 了个packge,运行报错。原因:package main mian()方法执行
  • 坑二
    nil在Go中相当与其它语言中的NULL、null和None等,在实际的使用中表示某一个变量为空。nil只能赋值给指针、channel、func、interface、map或slice类型的变量。如果将nil赋值给其他变量的时候将会引发panic。
  • 坑三
    我用的开发工具是JetBrains GoLand,需要在setting->go 栏中设置GOPATH,或者设置环境变量,否则编辑器run运行的时候找不到库。
  • 坑四
    golang的package很有意思,文件夹名称不是 package名称,但是import的时候是目录名称,使用的时候用package名称,意思是你定义个 my的包,package定义为foo, 那么你要import my 然后调用用foo. 这里坑还没有完,因为我只看了语法教程,http://www.runoob.com/go/go-range.html 里面没有说package的问题,包里面的函数需要被外面调用,需要首字母大写!!!, 这种坑网上很难收到,新手又很懵逼的。。。
  • 坑五
    文档里面没有说配置mysql,看到控制器章节,赞conf/app.conf里面加mysql配置,加了不行,然后看模型的时候,才看到需要用到

https://github.com/go-sql-driver/mysql 这个库,在main.go里面import _ "github.com/go-sql-driver/mysql"
然后再去main.go中去连接数据库,而且那个mysql文档不太友好,具体用法需要去专门看,如果用到orm,就需要orm.RegisterDataBase

  • 坑六
    由于笔者php作为主要开发语言,go的接口和php的接口有点区别,Go 语言接口

Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口。 重点:只要实现了这些方案就是实现了这个接口!!!!
为了加深记忆,以下代码为示例:

package main

import "fmt"

type a interface {
    call(string)
}

type b interface {
    call(string)

}

type mycall struct {
    title string
}

func (m mycall) call(a string)  {
    fmt.Println(m.title)
}

func main() {
    var test b
    test = mycall{title:"呵呵"}
    test.call("hello")

    if _, ok := test.(a); ok {
        fmt.Println("实现了")
    }
}

当接口a,接口b相同时,他认为只要实现了接口,都是有效的, 如果把a的call改成call(int),它则不认为实现了a的接口,大家可以自己试一试,这和php有点区别,php转go一些思维逻辑要变下

坑七

由于是新学的,手册也是浏览式的看的,半天就看完了,很多没仔细看,包里面的init函数会先执行都没看到,这个是自己坑的自己,我还奇怪那些怎么初始化的,也没有地方调用init,原来是加载包后自动先执行的

坑八

defer这个比较坑,主要是参数的问题,虽然是return后执行,但是他传进去的参数确是当前的参数变量

标签: 无

发表评论: