Go 从入门到精通(三)字符串,时间,流程控制,函数

一、strings和strconv的使用

strings

strings.HasPrefix(s string,preffix string) bool: 判断字符串s是否以prefix开头

stirngs.HasSuffix(s string,suffix string) bool: 判断字符串s是否以suffix结尾

strings.Index(s string,str string) int: 判断str在s中首次出现的位置,如果没有出现,则返回-1

strings.LastIndex(s string,str string) int: 判断str在s中最后出现的位置,如果没有出现,则返回-1

strings.Replace(str string,old string,new string,n int): 字符串替换

strings.Count(str string,count int)string: 字符串计数

strings.Repeat(str string,count int) string: 重复count次str

strings.ToLower(str string) 转换为小写

strings.ToUpper(str string)string: 转换为大写

strings.TrimSpace(str string): 去掉字符串首位空白字符

strings.Trim(str string,cut string): 去掉字符串首尾cut字符

strings.TrimLeft(str string,cut string): 去掉字符串首部cut字符

strings.TrimRight(str string,cunt string): 去掉字符串尾部cut字符

strings.Field(str string): 返回str空格分隔的所有子串的slice

string.Split(str string,split string): 返回str split分割的所有子串的slice

strings.Join(s1 []string,sep string): 用sep把s1中的所有元素连接起来

strconv

scronv.Itoa(i int):把一个整数转换成字符串

scronv.Atio(str string)(int,errror): 把一个字符串转换成整数

二、Go中时间和日期类型

当前时间:now:= time.Now()

time.Now().Day()

time.Now().Minute()

time.Now().Month()

time.Now().Year()

time.Duration用来表示纳秒

一些常用的时间常量

const ( Nanosecond Duration = 1 Microsecond =1000 * Nanosecond Millisecond =1000 * Microsecond Second =1000 * Millisecond Minute =60 * Second Hour =60 * Minute )

格式化

package main

import "fmt"

func main() {
    var a int = 10
    //通过&a打印a的指针地址
    fmt.Println(&a)
    //定义一个指针类型的变量p
    var p *int
    //讲a的指针地址复制给p
    p = &a
    fmt.Println(*p)
    //给指针p赋值
    *p = 100
    fmt.Println(a)
}

三、指针类型

普通的类型,变量存的就是值,也叫值类型 获取变量的地址,用&, 指针类型,变量存的是一个地址,这个地址存的才是真正的值 获取指针类型所指向的值,用*,例如:var *p int, 使用 *p获取p指向值

通过下面的代码例子理解:

package main

import "fmt"

func main() {
    var a int = 10
    fmt.Println(&a)

    var p *int
    p = &a
    fmt.Println(*p)
    *p = 100
    fmt.Println(a)
}

四、流程控制

if else 分支判断

常见格式类型如下: if 条件{ }

if 条件{ }else{ }

if 条件{ }else if 条件{ }else{ }

switch case

语法格式:

switch var {
    case var1:
    case var2:
    case var3:
    default:

}

如果满足了var1 想要穿透下一个需要添加fallthrough

例子如下:

package main

import "fmt"

func main() {
    var a int = 0

    switch a {
    case 0:
        fmt.Println("a 等于0")
        fallthrough
    case 1:
        fmt.Println("a等于1")
    default:
        fmt.Println("a等于默认值")
    }

}

如果我们没有添加fallthrough只会打印a等于0,但是现在回把case1中的打印内容也打印出来

同样这里我们需要知道case 后面是可以写条件的

for语句

语法 for 初始化变量;条件判断;变量修改{ }

一个简单的例子

for i:=0;i<100;i++{
    fmt.Println(i)
}

for循环的其他几种常见写法

for 条件 { }

死循环的写法 for { }

for range语句

通过一个例子理解:

str := "hello 世界"
for i,v := range str{
    fmt.Printf("index[%d] val[%c] len[%d]\n",i,v,len([]byte(string(v))))
}

这里需要注意的一个问题是,range str返回的是两个值,一个是字符串的下标,一个是字符串中单个的字符

goto 和label语句

package main

import "fmt"

func main() {
    LABEL1:for i:=0;i<5;i++{
        for j:=0;j<5;j++{
            if j == 4{
                continue LABEL1
            }
            fmt.Printf("i is :%d and j is:%d\n",i,j)
        }
    }
}

代码中我们在continue 后面添加了一个LABEL1这样当循环匹配到j等于4的时候,就会跳出循环,重新回到最外成i的循环,而如果没有LABEL1则就会跳出j的本次循环,执行j++进入到j的下次循环

我们接着看goto的用法,但是代码中我们不建议使用goto

package main

import "fmt"

func main() {
    i :=0
    HEAR:
    fmt.Println(i)
    i++
    if i == 5{
        return
    }
    goto HEAR
}

break 和continue 一句话解释:break是终止整个循环,continue是终止此次循环

五、函数详解

声明语法

func 函数名 (参数列表) [(返回列表)]{ }

一些常见的写法例子

func add(){

}

func add(a int,b int){ }

func add(a int,b int) int {

}

func add(a int,b int) (int,int) {

}

func add(a,b int)(int,int){

}

go函数的特点

  1. 不支持重载,一个包不能包含连个名字一样的函数
  2. 函数是一等公民,函数也是一种类型,一个函数可以赋值给变量
  3. 匿名函数
  4. 多返回值

其他几个概念可能都好理解,我们这里主要说说第二条,函数也是一种类型,一个函数可以赋值给变量

通过下面的例子演示

package main

import "fmt"

type add_func func(int,int) int


func add(a,b int) int {
    return a+b
}

func operator(op add_func,a int,b int) int {
    return op(a,b)
}
func main() {
    c := add
    fmt.Println(c)
    sum := operator(c,100,200)
    fmt.Println(sum)
}

这里通过type自定义了一个add_func类型

函数参数传递方式

这里主要有两种方式:值传递,引用传递

无论是值传递还是引用传递,传递给函数的都是变量的副本,不过值传递的是值的拷贝,引用传递传递的是地址的拷贝,一般来说,地址拷贝更为高效,而值拷贝取决于拷贝的对象的大小,对象越大,则性能越低

命名返回值的名字

通过下面的例子理解:

func add_sum(a,b int)(c int){
    c = a + b
    return 
}

下划线标识符,用来忽略返回值

可变参数

表示0个或多个参数 fucn add(arg...int) int{ }

表示1个或多个参数 func add(a int,arg...int) int { } 其中arg是一个slice,我们可以通过arg[index]获取参数 通过len(arg)可以判断参数的个数

defer用途

  1. 当函数返回时,执行defer语句,因此,可以用来做资源清理
  2. 多个defer语句,按先进后厨的方式执行
  3. defer语句中变量,在defer声明时就决定了

通过下面的例子理解:

package main
import "fmt"

func main() {
    a:=0
    defer fmt.Println("defer---->",a)
    a++
    fmt.Println(a)

}

结果会在最后打印defer---->0 ,这里就体现了defer语句中变量,在defer声明时就决定了 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰同学骚年

.NET基础拾遗(1)类型语法基础和内存管理基础

在.NET中所有的内建类型都继承自System.Object类型。在C#中,不需要显示地定义类型继承自System.Object,编译器将自动地自动地为类型添...

802
来自专栏Golang语言社区

Go语言中字符串的查找方法小结

1.func Contains(s, substr string) bool这个函数是查找某个字符是否在这个字符串中存在,存在返回true import ( ...

33010
来自专栏漫漫全栈路

C#历代版本新特性——面试题常用

掌握一门语言,当然要掌握它的特性,而随着C#历代版本的迭代更替,C#语言也日趋完善,在C#2.0~C#4.0版本所带来的新的语法特性格外重要。C#的新特性,其...

3859
来自专栏一个会写诗的程序员的博客

函数式编程与面向对象编程[4]:Scala的类型关联Type Alias函数式编程与面向对象编程[4]:Scala的类型关联Type Alias

scala里的类型,除了在定义class,trait,object时会产生类型,还可以通过type关键字来声明类型。

783
来自专栏MyBlog

Effective.Java 读书笔记(1)静态工厂和构造方法

用户在获得类它本身的实例的时候,通常会想到的就是使用public的构造器,但是一个类可以提供一个public的工厂方法。 这种工厂方法简化了返回该类实例的静态...

632
来自专栏余林丰

虚拟机类加载机制(1)——类加载时机

由于道行不够深,所以此篇类加载机制的讲解主要来自于《深入理解Java虚拟机——JVM高级特性与最佳实践》的第7章 虚拟机类加载机制。 在前面《初识Java反射》...

1939
来自专栏Jackson0714

不惧面试:委托

33813
来自专栏Python中文社区

Python源码剖析之整数对象

專 欄 ❈ 松直,Python中文社区专栏作者 专栏地址: http://www.zhihu.com/people/songzhili?utm_source...

1998
来自专栏Golang语言社区

Golang语言之defer-再议

defer语句被用于预定对一个函数的调用。我们把这类被defer语句调用的函数称为延迟函数。注意,defer语句只能出现在函数或方法的内部。 一条defer语句...

34014
来自专栏Java帮帮-微信公众号-技术文章全总结

通过字节码分析JDK8中Lambda表达式编译及执行机制【面试+工作】

在Class文件中,方法调用即是对常量池(ConstantPool)属性表中的一个符号引用,在类加载的解析期或者运行时才能确定直接引用。

611

扫码关注云+社区