https://www.jianshu.com/p/77be2afa225d
if num == 3 { fmt.Println("index 3 :", i) }else{ fmt.Println(num) }
//这种场景适用 条件值是固定的业务场景 i := 5 switch i{ case 1: fmt.Println("i is equal to 1") case 2: fmt.Println("i is equal to 2") case 3,4,5,6: fmt.Println("i is equal to 3,4,5 or 6") fallthrough default: fmt.Println("others") } //这种场景适用 条件值不固定,为某一区间的业务场景 switch { case i < 0: fmt.Println("小于零") case i > 0: fmt.Println("大于零") default: fmt.Println("等于零") }
for init; condition; post{} //和C的for一样 for condition{} //和while一样 for{} //结合break,continue nums := []int{2, 3, 4} for i, num := range nums { if num == 3 { fmt.Println("index 3 :", i) }else{ fmt.Println(num) } }
func main(){ result1,result2 := swap("hello", "kitty") } func swap(x, y string) (string, string) { return y, x }
Go的函数写法和其它语言不一样,先申明变量的名字,再申明变量的类型。设计者觉得这样才符合正常人类的思维方式
Go函数和通过方法名的大小写来实现对外权限的控制
Go函数不支持重载
Go语言的函数的参数支持不指定数量和类型
func main(){ result := sum(3,5,7,9) fmt.Println("结果为:", result) } func sum(aregs ...int) int { s := 0 for _, number := range aregs{ s += number } return s }
type Books struct { title string author string subject string book_id int } func main() { var Book1 Books Book1.title = "Go 语言" Book1.author = "www.runoob.com" Book1.subject = "Go 语言教程" Book1.book_id = 6495407 fmt.Printf( "Book title : %s/n", book1.title); var Book2 Books=Books{"Go 语言", "www.runoob.com", "Go 语言教程", 6495407} fmt.Println(Book2) fmt.Println(Book2.title) Book4 :=Books{ title:"testJson", subject:"testSubject", } } type rect struct { width int height int } func (r *rect) area() int { return r.width * r.height } func main() { r := rect{width: 10, height: 5} fmt.Println("area: ", r.area()) }
func main(){ stu := Student{"chain"} fmt.Println(stu) aStu := AStudent{Student{"chain"}, 23} fmt.Println(aStu) } type Student struct{ name string } type AStudent struct{ Student Age int }
Go语言通过实现接口的方式,来实现多态,需要用到指针 &,不能指定为非 Phone接口的实现类,否则会报错
Go语言简洁归简洁,有时候过于简洁并不方便,比如不能知道这个类的接口是哪个接口
定义一个Phone的接口,它的实现类必须实现call()方法 type Phone interface { call() } 定义一个普通类NokiaPhone type NokiaPhone struct { } 实现call()的方法 func (nokiaPhone NokiaPhone) call() { fmt.Println("I am Nokia, I can call you!") } type IPhone struct { } func (iPhone IPhone) call() { fmt.Println("I am IPhone, I can call you!") } func main() { var phone Phone phone = &NokiaPhone{} phone.call() phone= &IPhone{} phone.call() }
https://www.cnblogs.com/grimm/p/5623860.html
&符号的意思是对变量取地址,如:变量a的地址是&a
符号的意思是对指针取值,如: &a,就是a变量所在地址的值,当然也就是a的值了
是不可以抵消的
a和
&a是一样的,都是a的值,值为1 (因为*&互相抵消掉了)var a int = 1 var b *int = &a fmt.Println("a = ",a) //1 fmt.Println("&a = ",&a)//0xc00000a098 a的内存地址 fmt.Println("*&a = ",*&a)//1 *和&抵消掉了,还是1 fmt.Println("b = ",b) //0xc00000a098 b是a的指针,和 &a的值一样 fmt.Println("&b = ",&b) //0xc000006028 指针的指针 fmt.Println("*b = ",*b) //1 b指针指向的值
http://developer.51cto.com/art/201306/400489.htm
defer语句延迟执行一个函数,该函数被推迟到当包含它的程序返回时(包含它的函数 执行了return语句/运行到函数结尾自动返回/对应的goroutine panic/当前线程 runtime.Goexit())执行。
按照栈的形式后进先出的原则依次执行每个defer注册的函数。通常用来进行资源释放,错误的处理,清理数据等。
//打印的顺序 main method 、method2、 method1,因为类似于栈模型,后进先出 func main() { defer doSomething("method 1") defer doSomething("method 2") fmt.Println("i am main method") } func doSomething(things string){ fmt.Println(" ia am doing somthing",things) }
func main() { i := 0 defer fmt.Println(i) //此时是0 i++ defer fmt.Println(i) //此时是1 }
func main() { fmt.Println(judgeNumber(-1)) fmt.Println(judgeNumber(0)) fmt.Println(judgeNumber(1)) } func judgeNumber(num int) string{ var lockName ="numlock" getLock(lockName) defer unlock(lockName) switch { case num<0 : return "nagetive" case num==0 : return "Zero" default: return "good number" } } func getLock(lockname string){ fmt.Println("i got the lock of ",lockname) } func unlock(lockname string){ fmt.Println("i release the lock of ",lockname) }
https://www.jianshu.com/p/f30da01eea97
异常和错误的正确使用方式:
//当hostType为 virtual_machine 或者bare_metal时校验通过,否则校验失败 func (self *AgentContext) IsValidHostType(hostType string) bool { return hostType == "virtual_machine" || hostType == "bare_metal" }
一般error的返回值放在返回值的最后一个
规范使用errors.New的使用,放在常量文件里面,标准化输出,而不是每次用的时候,自己定义输出内容
util.go 里面定义这样的常量 var ERR_NOT_EXIST = errors.New("file is not exist") 其它地方直接使用 err := createResource1() if err != nil { return ERR_CREATE_RESOURCE1_FAILED }
if f < 0 { return 0, errors.New("math: square root of negative number") }
// 定义一个 DivideZeroError 结构,分母为0的专门的异常处理类 type DivideError struct { dividee int divider int } // 实现 `error` 接口 func (de *DivideError) Error() string { strFormat := ` Cannot proceed, the divider is zero. dividee: %d divider: 0 ` return fmt.Sprintf(strFormat, de.dividee) } // 定义 `int` 类型除法运算的函数 func Divide(varDividee int, varDivider int) (result int, errorMsg string) { if varDivider == 0 { dData := DivideError{ dividee: varDividee, divider: varDivider, } errorMsg = dData.Error() return } else { return varDividee / varDivider, "" } } func main() { // 正常情况 if result, errorMsg := Divide(100, 10); errorMsg == "" { fmt.Println("100/10 = ", result) } // 当被除数为零的时候会返回错误信息 if _, errorMsg := Divide(100, 0); errorMsg != "" { fmt.Println("errorMsg is: ", errorMsg) } }
func main(){ defer func(){ if err := recover(); err != nil{ //捕捉异常并处理 fmt.Println("err: ", err) }}() if num, err := delive(20, -5); err == nil{ fmt.Printf("%f / %f = %f/n", 20.0, -5.0, num) }else{ fmt.Println(err) } if num, err := delive(20, 0); err == nil{ fmt.Printf("%f / %f = %f/n", 20.0, 0.0, num) }else{ fmt.Println(err) } fmt.Println("Test") } func delive(numA, numB float32) (float32, error){ if numB < 0{ return 0, errors.New("被除数不能为负数") }else if numB == 0{ panic("被除数不能为0") //抛出异常 }else{ return numA/numB, nil } }
var test string="120" //把test字符串转换为10进制的32位结果的数字 result,err:=strconv.ParseInt(test,10,32) if err!=nil{ fmt.Println(result) } count :=2000 resultResult:= strconv.Itoa(count)
https://blog.csdn.net/zhangzhebjut/article/details/25564457
import ( . "fmt" "./learn1" ) import( f “fmt” )
设置访问端口为 8888
func main() { http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { fmt.Fprintln(writer,"<h1>hello kitty </h1>") }) http.ListenAndServe(":8888",nil) }
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { fmt.Fprintf(writer,"<h1>hello kitty %s</h1>",request.FormValue("name")) })
func main() { for i :=0;i<5000;i++{ go printHelloWorld(i) } time.Sleep(time.Second) } func printHelloWorld(i int){ fmt.Printf("hello kitty ,%d /n",i) }