白羽
2018-08-13
来源 :网络
阅读 1813
评论 0
摘要:本文将带你了解WEBAPP开发之go 基础部分,希望本文对大家学WEBAPP有所帮助。
本文将带你了解WEBAPP开发之go 基础部分,希望本文对大家学WEBAPP有所帮助。
第一章
gobuild带有main的文件
goinstall包文件
获取远程包
gogetgithub.com/astaxie/beedb
-uupdate
第二章
string内的值是不能被改变的,转为[]byte可以改变
map和其他基本型别不同,它不是thread-safe,在多个go-routine存取时,必须使用mutexlock机制
//还没仔细看go-routine相关的内容,但是操作系统讲过什么是互斥锁
delete(rating,"C")//删除maprating中key为C的元素
//第二遍记这一点,不怎么用的东西真的是很难记得住
break操作是跳出当前循环,continue是跳过本次循环
//之前无闻那篇笔记里非常快的带过了break和continue,开始写代码才发现都是很有用的东西,用得好会让代码好看简洁
//代码来自astaxie
forindex:=10;index>0;index--{
ifindex==5{
break//或者continue
}
fmt.Println(index)
}
//break打印出来10、9、8、7、6
//continue打印出来10、9、8、7、6、4、3、2、1
switch中每个case里的执行语句后面默认是有break的,所以匹配后会自动跳出,不想跳出用fallthrough,每个case后可以跟多个值,case2,3,4这样
//代码来自astaxie
i:=10
switchi{
case1:
fmt.Println("iisequalto1")
case2,3,4:
fmt.Println("iisequalto2,3or4")
case10:
fmt.Println("iisequalto10")
default:
fmt.Println("AllIknowisthatiisaninteger")
}
函数返回值声明了两个变量output1和output2,如果你不想声明也可以,直接就两个类型
如果只有一个返回值且不声明返回值变量,那么你可以省略包括返回值的括号
(注意:这样可以,但是不推荐,可读性降低!)
函数类型,可以传递
packagemain
import"fmt"
typetestIntfunc(int)bool//声明了一个函数类型
funcisOdd(integerint)bool{
ifinteger%2==0{
returnfalse
}
returntrue
}
funcisEven(integerint)bool{
ifinteger%2==0{
returntrue
}
returnfalse
}
//声明的函数类型在这个地方当做了一个参数
funcfilter(slice[]int,ftestInt)[]int{
varresult[]int
for_,value:=rangeslice{
iff(value){
result=append(result,value)
}
}
returnresult
}
funcmain(){
slice:=[]int{1,2,3,4,5,7}
fmt.Println("slice=",slice)
odd:=filter(slice,isOdd)//函数当做值来传递了
fmt.Println("Oddelementsofsliceare:",odd)
even:=filter(slice,isEven)//函数当做值来传递了
fmt.Println("Evenelementsofsliceare:",even)
}
*Panic
是一个内建函数,可以中断原有的控制流程,进入一个令人恐慌的流程中。当函数F调用panic,函数F的执行被中断,但是F中的延迟函数会正常执行,然后F返回到调用它的地方。在调用的地方,F的行为就像调用了panic。这一过程继续向上,直到发生panic的goroutine中所有调用的函数返回,此时程序退出。恐慌可以直接调用panic产生。也可以由运行时错误产生,例如访问越界的数组。
//摘录一段正经的panic介绍,虽然都大概知道这东西是干嘛的,但错误处理总是体现一个程序员的水平
*Recovery
是一个内建的函数,可以让进入令人恐慌的流程中的goroutine恢复过来。recover仅在延迟函数中有效。在正常的执行过程中,调用recover会返回nil,并且没有其它任何效果。如果当前的goroutine陷入panic,调用recovery可以捕获到panic的输入值,并且恢复正常的执行。
*init和main函数不能有参数和返回值,且每包一个(init一包可以多个,但是强烈建议只写一个)
*import别名,“.”等别名都很简单,(提一点:_操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的init函数。)
import(
"database/sql"
_"github.com/ziutek/mymysql/godrv"
)
*struct声明方式
三种
typepersonstruct{
namestring
ageint
}
//第一种
varpperson
p.name="xy"
p.age="18"
//2
p:=person{"xy",18}
//3
p:=new(person)
//一个匿名字段的例子
packagemain
import"fmt"
typeSkills[]string
typeHumanstruct{
namestring
ageint
weightint
phonestring
}
typeStudentstruct{
Human//匿名字段,struct
Skills//匿名字段,自定义的类型stringslice
int//内置类型作为匿名字段
specialitystring
phonestring//human中也有phone字段
}
funcmain(){
//初始化学生Jane
jane:=Student{Human:Human{"Jane",35,100},speciality:"Biology"}
//现在我们来访问相应的字段
fmt.Println("Hernameis",jane.name)
fmt.Println("Herageis",jane.age)
fmt.Println("Herweightis",jane.weight)
fmt.Println("Herspecialityis",jane.speciality)
//我们来修改他的skill技能字段
jane.Skills=[]string{"anatomy"}
fmt.Println("Herskillsare",jane.Skills)
fmt.Println("Sheacquiredtwonewones")
jane.Skills=append(jane.Skills,"physics","golang")
fmt.Println("Herskillsnoware",jane.Skills)
//修改匿名内置类型字段
jane.int=3
fmt.Println("Herpreferrednumberis",jane.int)
//最外层的优先访问
Bob:=Employee{Human{"Bob",34,"777-444-XXXX"},"Designer","333-222"}
fmt.Println("Bob'sworkphoneis:",Bob.phone)
//如果我们要访问Human的phone字段
fmt.Println("Bob'spersonalphoneis:",Bob.Human.phone)
}
*值传递和引用传递
>如果一个method的receiver是\*T,你可以在一个T类型的实例变量V上面调用这个method,而不需要&V去调用这个method;
如果一个method的receiver是T,你可以在一个*T类型的变量P上面调用这个method,而不需要*P去调用这个method
*interface:Go通过interface实现了duck-typing:即"当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子"。
packagemain
import"fmt"
typeHumanstruct{
namestring
ageint
phonestring
}
typeStudentstruct{
Human//匿名字段
schoolstring
loanfloat32
}
typeEmployeestruct{
Human//匿名字段
companystring
moneyfloat32
}
//Human实现SayHi方法
func(hHuman)SayHi(){
fmt.Printf("Hi,Iam%syoucancallmeon%s\n",h.name,h.phone)
}
//Human实现Sing方法
func(hHuman)Sing(lyricsstring){
fmt.Println("Lalalala...",lyrics)
}
//Employee重载Human的SayHi方法
func(eEmployee)SayHi(){
fmt.Printf("Hi,Iam%s,Iworkat%s.Callmeon%s\n",e.name,
e.company,e.phone)
}
//InterfaceMen被Human,Student和Employee实现
//因为这三个类型都实现了这两个方法
typeMeninterface{
SayHi()
Sing(lyricsstring)
}
funcmain(){
mike:=Student{Human{"Mike",25,"222-222-XXX"},"MIT",0.00}
paul:=Student{Human{"Paul",26,"111-222-XXX"},"Harvard",100}
sam:=Employee{Human{"Sam",36,"444-222-XXX"},"GolangInc.",1000}
tom:=Employee{Human{"Tom",37,"222-444-XXX"},"ThingsLtd.",5000}
//定义Men类型的变量i
variMen
//i能存储Student
i=mike
fmt.Println("ThisisMike,aStudent:")
i.SayHi()
i.Sing("Novemberrain")
//i也能存储Employee
i=tom
fmt.Println("Thisistom,anEmployee:")
i.SayHi()
i.Sing("Borntobewild")
//定义了sliceMen
fmt.Println("Let'suseasliceofMenandseewhathappens")
x:=make([]Men,3)
//这三个都是不同类型的元素,但是他们实现了interface同一个接口
x[0],x[1],x[2]=paul,sam,mike
for_,value:=rangex{
value.SayHi()
}
}
*element.(type)语法不能在switch外的任何逻辑里面使用,如果你要在switch外面判断一个类型就使用comma-ok(ifvalue,ok:=element.(int);ok{...})
*reflection
varxfloat64=3.4
p:=reflect.ValueOf(&x)
v:=p.Elem()
v.SetFloat(7.1)
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之WebApp频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号