Go学习笔记 (二) : 流程控制(if,for,switch) 与 函数 与 struct (匿名字段)

为了扩展的扩展

流程控制

if

if condition {
    // do something
} else if condition {

}

if 后接条件语句(表达式) , 无括号

if 9>8 {
    //do some...
} else if 8>8 {

} else{

}

for

for expr1; expr2 ;expr3 {
    // some code
}

expr1 为初试化变量语句, 仅执行一次
expr2 为循环条件语句, 每次循环前都会判断其值
expr3 是改变循环变量的地方, 每次循环后执行
其中expr1,expr2,expr3均可省略

for ; ; {
    // some code 
}

另一种是仅留下 循环条件语句 如:

for ; 9>8 ; {
    // some code 
}

此时 2个分号 也可省略, 即:

for 9>8 {
    //some code
}

啊, 和java的while 多像

me := map[string]string{"name":"wq","age":"19","long":"200"}
for k,v := range me {
    fmt.Println(k,v)
}

嗯, 是的foreach(for in) 就是这个feel
尤其提示, 如果不使用 k , 请用_ 替代, 避免编译错误

switch

switch exp {
    case 0:
        //do some ...
    case 1,2,3:
        //do some..
    default:
        //do some..
}

对于exp不需要括号
每个case后, 都默认带有break, 不会往下执行
如需执行后面的case,可使用fallthrough 关键字
可以用 , 号分隔代表多个case
default就不说了, 类似与if的else

最后写个冒泡排序法复习巩固下

package main

import "fmt"

func main(){ 
    slice := []int{3,4,2,9,1,0,88,44,20}
    maopao(slice)
    fmt.Println(slice)
}

func swap(slice []int, index1 int,index2 int) {
    temp := slice[index1]
    slice[index1]=slice[index2]
    slice[index2]=temp
}

func maopao(slice []int) {
    for i := 0; i< len(slice)-1;i++ {
        for j:=0; j< len(slice)-1-i; j++ {
            if slice[j]>slice[j+1] {
                swap(slice,j,j+1)
            }       
        }       
    }
}

99 乘法

package main

import "fmt"

func main(){ 
    num, num2 := 1, 1 
    for num<=9 {
        num2 = 1
        for num2<=num {
            fmt.Printf("%d * %d = %d\t",num2,num,num*num2)
            num2++  
        }       
        fmt.Println()
        num++   
    }
}

使用了for的完整版 , if 判断
slice指针传递 可变性

函数

func语法

func funcName (params...) (returns...) {
    //some code
    return ...
}

如,无参无返回值

func test(){
    //some code
}

单参数,单返回值

func test(id int) int {
    //some code
    return 0
}

多参数, 多返回值

func test (id int, skills []string) (int , map[string]int) {
    //some code
    numbers := map[string]int{"one":1,"two":2,"three":3}
    return 0 , numbers
}

大概就是这些, 写个阶乘玩玩

func jiechen(n int) int {
    if n==1 {
        return 1
    }
    return n * jiechen(n-1)
}
func main(){
    sum := jiechen(4) //24
}

defer延迟

func test(){
    fmt.Println("func code run")
    for i:=0; i<8; i++ {
        defer fmt.Println("defer",i)
    }
    fmt.Println("func code last")
}

后进先出的队列机制, 逆序输出了 i
延迟执行, 在return之前

import

import (
    . "fmt"
    _ "fmt"
    f "fmt"
)

用 . 代表无需前缀, 直接调用fmt的方法
用_ 代表不使用fmt的函数, 仅加载
其他名称则为别名 , 如 f.Println()

a func is a type or a value ??

package main

import "fmt"

func main(){
    slice := []int{1,2,3,4,5,6,7,8,9}
    fmt.Println("slice:",slice)
    odd := filter(slice,isOdd)
    even:= filter(slice,isEven)
    fmt.Println(odd,even)
}

type funcType func(int) bool

func isOdd(i int) bool {
    if i%2 ==0 {
        return false
    }
    return true;
}

func isEven(i int) bool {
    if i%2 ==0 {
        return true
    }
    return false
}

func filter(slice []int,f funcType) []int {
    var result []int
    for _, value := range slice {
        if f(value){
            result = append(result, value)
        }
    }
    return result
}

将func作为一个类型, 置于参数中, 由于go也是强类型, 所以需要添加自定义类型
将func作为实参(值)传递给另一个函数, 然后被调用

struct

语法定义

type person struct {
    name string
    age int
}

使用

 var p person
 p.name="wq"
 p.age = 79
 
 p1 := person{"wq",89}
 p2 := person{name:"wq",age:99}
 

匿名字段

type humen struct {
    name string
    age int
    long int
}

type Skills []string

type person struct {
    humen
    int
    Skills
    name string
    phone string
}

func main(){
    p := person{humen{"wq",39,99},666,[]int{"c","java","c#"},"pwq","110"}
    fmt.Println(p,p.name,p.age,p.long,p.phone,p.Skills,p.int)
    //可直接访问匿名字段的 字段, 但可能会覆盖匿名字段的 字段
}

通过2个struct 实现了类似 继承
通过不给字段名,仅给字段类型定义一个匿名字段
可直接访问匿名字段, 但可能覆盖匿名字段中的字段
匿名字段 还可以为 自定义类型, 基础类型 , slice, map, array等

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容