golang基础语法学习

golang的变量声明

基本格式
var identifier [type] [= value]

例子

var a int
var b string
var c bool
var d int = 8
var e string = "hello"
var f = "hello"

例子2

var (
  a int
  b string
  c bool
  d int = 8
  e string = "hello"
)

这个就跟golang的package引入类似,可以用括号将多个项目括起来,这样就只用写一个var或者import。

例子3

a := 20

golang的常量声明

基本格式
const identifier [type] = value

例子

const a int = 10
const b = 10
const c string = "233"
const d = "233"

例子2

const (
  a int = 100
  b = 10
  c string = "233"
  d = "233"
)

例子3

const (
  a = 100
  b 
  c = "233"
  d
)

和变量不同,常量的声明可以在后面什么都不跟,例子中的bd等于他们之前第一个有赋值的常量。即:b = 100 d = "233"

例子4

const (
  a = iota  //0
  b         //1
  c = 234   //234
  d = iota  //3
  e         //4
)

iota是一个很神奇的玩意。在一个const的括号内,第一个iota是0,之后的每一行,iota会自增1,无论你是否使用iota。

golang的基本类型

string

  1. string的声明
    string可以用双引号"也可以用`来声明。
var a = "123"
var b = `\n123`      //等同于C#中 var b = @"\n123"
  1. string的常用操作

取字符串长度

var a = "123"
len(a)

格式化输入到字符串

var a = 123
var c = fmt.Sprintf("%d",a)

字符串分割

var a = "123;234;345"
var aSlice = strings.Split(a,";")

字符串存在

var a = "123"
var aBool = strings.Contains(a,"2")

前后缀判断

var a = "pre123suf"
var aPreBool = strings.HasPrefix(a,"pre")
var aSufBool = strings.HasSuffix(a,"suf")

字符串查找

var a = "1234561"
var index = strings.Index(a,"1")
index = strings.LastIndex(a,"1")

字符串拼接

var strArr []string = {"123","234","345"}
var result = strings.Join(strArr, ";")
  1. string底层知识

底层是数组,可以和byte数组进行转换

var str = "123456789"
var c = str[0]  //使用下标访问元素
for index,val := range str {
  fmt.Printf("index = %d, value = %c", index, val)
}

字符串不能对单个元素直接进行更改(str[0] = '0'是非法的)。需要转成切片再进行更改。

var str = "123"
strSlice = []byte(str)
strSlice[0] = '0'
str =  string(strSlice)

字符串是由byte字节存储,所以字符串的长度是byte数组的长度。如果字符串中有中文,字符串长度会和字的个数不一致。

var str = "Hello, 中文"
fmt.Printf("length of str = %d", len(str))   //length of str = 13
runeSlice = []rune(str)
fmt.Printf("length of str = %d", len(runeSlice))   //length of str = 9

时间和日期类型

获取当前时间

now := time.Now()

获取时间戳

timeStamp := time.Now().Unix()

时间和时间戳转换

now := time.Now()
timeStamp := now.Unix()
now = time.Unix(timeStamp,0)

定时器

ticker := time.Tick(time.Second)
for i:= range ticker{
  fmt.Printf("%v\n", i)
}

时间常量

const (
  Nanosecond Duration
  Microsecond = 1000 * Nacosecond
  Millisecond = 1000 * Microsecond
  Second = 1000 * Millisecond
)

格式化

now := time.Now()
now.Format("2006/01/02 15:04:05" )  //这时间是golang的诞生时间,只能写这个

流程控制

if-else

和c系列的if-else非常类似,只是可以再一开始声明一个变量,而且不用括号

a := 10
if a > 5 {
  fmt.Printfln("great than 5")
}
else {
  fmt.Printfln("less than 5")
}
fmt.Printf("value = %d", a)
if a := 10; a > 5 {
  fmt.Printfln("great than 5")
}
else {
  fmt.Printfln("less than 5")
}
fmt.Printf("value = %d", a)  //非法。a只能在if的范围内使用

for

循环只有for,没有while。
基本用法

for i := 0; i < 10; i++ {
  
}

while用法

for i < 10 {
}

无限循环

for {
}

range遍历

for _, val := range b {
  sum += val
}

switch

基本用法,不需要跟break,默认就是有break的情况。

a := 10
switch a{
  case 1:
    //do something
  case 2:
    //do something
   default:
    //do something
}

和if一样,可以在使用时声明变量

switch a := 10; a{
  case 1:
    //do something
  case 2:
    //do something
   default:
    //do something
}

可以多个case放在一起

switch a := 10; a{
  case 1, 3, 5, 7, 9:
    //do something
  case 2, 4, 6, 8, 10:
    //do something
   default:
    //do something
}

可以不写固定值,而是用条件控制

a := 10
switch {
  case a < 5:
    //do something
  case a > 5:
    //do something
   default:
    //do something
}

可以执行多个case

a := 10
switch {
  case a < 5:
    //do something
    fallthrough
  case a <10:
    //do something
   default:
    //do something
}

函数

基本格式

func functionName([parameterName type]) [returnType]{
}

连续的相同类型的参数,可以只写一次类型

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

多返回值, 返回值可以直接命名。不需要的返回值用_忽略

func calc(a, b int) (int, int){
  sum := a + b
  sub := a - b
  return sum, sub
}

func calc1(a, b int) (sum, sub int) {
    sum = a + b
    sub = a - b
    return
}

aa, _ := calc(a, b)

可变参数

func calc(b ...int) int {
    sum := 0
    for _, val := range b {
        sum += val
    }
    return sum
}

defer延迟执行。在函数返回之前执行。执行到defer时会进行压栈操作,函数执行完成后出栈执行defer。压栈时会把数据的当前值进行存储,即使后面改变也不会生效。

func testDefer() {
    defer fmt.Println("first defer")
    defer fmt.Println("second defer")
    defer fmt.Println("third defer")
    sam = "sam"
    defer fmt.Println("hello %s", sam)
    sam = "peter"
    fmt.Println("hello %s", sam)
}
//输出结果:
//hello peter
//hello sam
//third defer
//second defer
//first defer

函数可以存储在变量中。类似于函数指针或者delegate。可以声明匿名函数。

func func1(name string) {
  fmt.Printf("Hello %s\n", name)
}

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