zoukankan      html  css  js  c++  java
  • Golang基础

    一.go的四个运行命令

    go 命令 文件名 要么根据绝对路径去找,要么能在当前cmd路径下找到
    go 命令 项目名 去src下找

    1. go run 编译并执行,不保存编译后的文件
      2 go build 编译并保存
      默认放在当前cmd路径下
      -o 路径
      3 go install 编译并放在gopath下的bin目录下
      4 go fmt 格式化代码
    //表明当前文件是可执行文件
    //准确的说:表明当前文件属于可执行程序的根目录,可以加上func main
    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	fmt.Println("hello world")
    	time.Sleep(10 * time.Second)
    }
    

    二.变量

    5种声明方式:
    1 var 变量名... 类型字面量 有默认值,int 0,bool false,string ""

    	var a,d int
    	var b string
    	var c bool
    	fmt.Println(a) // 0
    	fmt.Printf("%q
    ",b) // ""
    	fmt.Println(c)  // false
    	fmt.Println(d)  // 0
    

    2 var 变量名1... 类型字面量 = 变量值1... 声明变量,给定初始值

    	var a,v int = 10,100
    	var b string = "老王"
    	var c bool = true
    	fmt.Println(a,b,c,v) // 10 老王 true 100
    

    3.var 变量名1... = 变量值1...

    	var a,b,c = 100,10,false
    	fmt.Println(a,reflect.TypeOf(a)) // 100 int
    	fmt.Println(b,reflect.TypeOf(b)) // 10 int
    	fmt.Println(c,reflect.TypeOf(c)) // false bool
    	b  = 100
    	fmt.Println(a==b)   //true
    

    4.变量名1... := 变量值1...
    适用条件:1.只能用于局部
    2.边至少有一个变量未被声明

    	var a int
    	b,a := "10",100
    	fmt.Println(a,reflect.TypeOf(a))
    	fmt.Println(b,reflect.TypeOf(b))
    

    5 var(
    变量名... 类型字面量
    变量名1... 类型字面量 = 变量值1...
    变量名1... = 变量值1...
    )

       var (
       	a int
       	b string = "隔壁老王"
       	c,d = 10.2,true
       )
       fmt.Println(a,b,c,d)//0 隔壁老王 10.2 true
    

    变量赋值:
    1 先声明后使用
    2 赋值类型要一直
    3 a,b,c = 值1,值2,值3
    4 交叉赋值

    变量的命名规范:
    推荐使用驼峰体
    小写开头,只用于本包下使用
    大写开头,用于开放

    	var a,b = 10,100
    	a,b = b,a
    	fmt.Println(a,b)//100 10
    

    三.常量

    go 常量 内存权限只读
    定义常量的三种方式

    1. const 常量名1... 类型字面量 = 值1... 没有初始值
    	const a,b int = 100,10
    	fmt.Println(a)//100
    
    
    1. const 常量名1... = 值1...
        const c,d = 100,true
    	fmt.Println(c,d)//100 true
    

    3 const( 常量组 若没有指定类型和值,会继承上面最靠近它的飞空常量,并且列数要相等
    ....
    ...
    )

    const(
        a,e int = 10,100
        b,f string = "张三","lxxdsb"
        c,m
        d,n
    )
    fmt.Println(a,b)
    fmt.Println(c,reflect.TypeOf(c))//10 张三
    fmt.Println(d,reflect.TypeOf(d))//张三 string
    fmt.Println(m,reflect.TypeOf(m))//lxxdsb string
    

    自增常量组:
    1 iota 常量计数器 从0开始计数,类型默认为int
    2 _ 占位符 占着茅坑不拉shit
    3 iota中断 定义一个值
    4 iota 恢复 继续写iota ,会继续计数(计数不会中断)
    5 多个iota

    const (
    		_ = iota
    		a
    		b
    		c string = "老王"
    		d  = iota
    		e
    		f
    		h
    	)
    	fmt.Println(a,b,c) // 1 2 老王
    	fmt.Println(d,e,f,h)// 4 5 6
    

    type 名字 类型字面量 自定义类型,给类型起别名
    6 iota 可以修改类型
    7 iota 可以参与运算

    type myint int
    const (
        a myint= iota
        b
    )
    fmt.Println(a,b,reflect.TypeOf(b))//0 1 main.myint
    

    四.运算符

    数字与数字间加减乘除,只要其中一个是小数,结果是浮点型,整形与整形,结果一定是整形
    程序只会在特定情况下(遇到浮点型,不管是变量还是数字),会把整形数字转成浮点型数字,再进行运算,
    但是,不会自动转换整形变量,(常量当做普通数字处理)

    //var a = 1+2
    //fmt.Println(a,reflect.TypeOf(a))
    
    //var a = 2.1 + 1
    //fmt.Println(a,reflect.TypeOf(a))
    
    //var a = 3/2
    //fmt.Println(a,reflect.TypeOf(a))
    
    //var a = 10/3
    //	//fmt.Println(a,reflect.TypeOf(a))
    
    //var a = ((1/2)+0.5)*3
    //fmt.Println(a,reflect.TypeOf(a))
    
    
    //var a = 3
    //const b = 2.5
    //var c = a/2.5
    //fmt.Println(c,reflect.TypeOf(c))
    
    //fmt.Println(true || false && true && false)
    
    
    //var a = 60
    //var b = 13
    ////      00001100
    //fmt.Println(a&b)
    
    //var a = 100
    //var b = &*&a   //*类型
    //var c = &a
    //fmt.Println(b,c)
    
    //fmt.Println(b,reflect.TypeOf(b))
    //*b += 200
    //fmt.Println(a)
    

    五.流程控制

    if 判断

    5个知识点
    1 if 条件 {
    代码体...
    }

    	var age int
        // 用户交互,输入年龄
    	fmt.Scanln(&age)
    
    	if age>20 {
    		fmt.Println("阿姨好")
    	}else{
    		fmt.Println("小姐好")
    	}
    

    2 if-else

    3 if-else if - else

    4 if嵌套

    var score int
    fmt.Print("输入你的分数:")
    if _, err := fmt.Scanln(&score); err != nil {
        fmt.Println("输入有误")
    }else{
        if score >= 90{
            fmt.Println("优秀")
        }else if score>= 70{
            fmt.Println("良好")
        }else{
            fmt.Println("挨打!")
        }
    }
    

    5 if [可执行语句;]条件{ 可执行语句里要是声明变量,只能用短声明

    if a:=1;true{
        fmt.Println(a)
        fmt.Println("我又进来了")
    }
    

    switch

    2 switch分支选择
    一 switch[可执行语句;] 判断量{
    case 被判断量1,被判断量2: if 判断量被判断量1 || 判断量被判断量2
    代码
    case 被判断量3:
    代码
    default:
    代码
    }

    break 基本用不上
    fallthrough 放在判断末尾,直接进入下case的代码

    var people string
    fmt.Print("有人来了:")
    fmt.Scanln(&people)
    
    var isugly = true
    
    switch people {
    case "帅哥","老板":
        fmt.Println("你好呀")
    case "姑娘":
        if isugly{
            fmt.Println("假装没看见")
        }else {
            fmt.Println("加个微信吧!")
        }
    default:
        fmt.Println("问路请出门右拐")
    }
    

    二 switch [可执行语句;]{
    case 条件1,条件2...
    代码提
    case 条件3
    代码体

    }
    
    switch score := 100; {
    case score>=90:
        fmt.Println("牛逼")
    case score>=80:
        fmt.Println("也牛逼")
    }
    

    for 循环:

    格式:
    for 初始条件;循环条件;追加条件{
    循环体代码....
    }

    //var a = 1
    //for fmt.Println("我是初始条件");a<=3;fmt.Println("我是追加语句"){
    //	a += 1
    //}
    

    省略形式:
    for ;循环条件;追加条件{
    循环体代码....
    }

    for a:=1;a<=3;{
        fmt.Printf("我执行了第%v遍
    ",a)
        a++
    }
    

    for 初始条件;循环条件;{
    循环体代码....
    }

    for a:=1;a<=3;{
        fmt.Printf("我执行了第%v遍
    ",a)
        a++
    }
    

    for 循环条件{
    循环体代码....
    }

    a:=1
    for a<=3{
        fmt.Printf("我执行了第%v遍
    ",a)
        a++
    }
    

    for {
    循环体代码....
    }
    是一个死循环

    a := 1
    for {
        fmt.Printf("我执行了第%v遍
    ",a)
        a++
    }
    

    for 循环的退出:
    1 break 跳出本层循环
    2 continue 结束本次循环,直接进入下一次
    3 变量开关

    for a,tag:=1,true;tag;a++{
        if a==3 {
            tag = false
        }
        fmt.Printf("我执行了第%v遍
    ",a)
    
    }
    

    标签:

    什么是标签:
    记录被标签者的信息
    在程序中记录当前代码位置
    为什么要有标签:
    标记不是目的,目的是使用.记录位置是为了快速找到它
    怎么用标签:
    定义标签: 直接在代码上加上标签名(大写加数字用以和变量区分开),定义了就一定要使用
    用标签:
    1 break+标签
    2 continue + 标签
    3 goto + 标签 降低了代码的可读性和可维护性
    注意点:
    1 只能用于函数内部跳转
    2 不能跳过变量声明

    LABEL1:
        for a:=1;a<=5;a++{
            fmt.Printf("外层执行了第%v遍
    ",a)
            for i:=1;i<=5;i++{
                fmt.Printf("内层执行了第%v遍
    ",i)
                if i == 3{
                    continue LABEL1
                }
            }
        }
        
        
        for a:=1;a<=5;a++ {
            fmt.Printf("外层执行了第%v遍
    ", a)
            if a==3{
                goto LABEL2
            }
        }
    
    LABEL2:
        fmt.Println("我是label,我被执行了")
        fmt.Println("我是label,我被执行了2")
    

    六.基本数据类型

    整型:
    有符号:int , int8 ,int16,int32,int64
    无符号:uint,uint8,uint16,uint32,uint64

    int8: -128-127
    正常使用:int,int64,uint,uint64
    

    浮点型:
    float32,float64

    flaot32:显示8位,精确到7位
    float64:显示17位,精确到16位(含整数位)
    

    强制类型转换:
    数字类型和数字类型之间进行转换,转换类型要能够完全表示被转换类型

    var a int64  = 1111111
    var b int8 = int8(a)
    fmt.Println(b,reflect.TypeOf(b))// 71 int8
    

    字符串类型:
    string
    strings包:字符串常用操作

    1. 判断是否以...开头
      HasPrefix(str,"....")
    str := "我真的真的真的真的很帅"
    
    fmt.Println(strings.HasPrefix(str, "我"))// true
    fmt.Println(strings.HasPrefix(str,"你"))// false
    fmt.Println("----------------")
    

    2 以....结尾
    HasSuffix(str,"...")

    fmt.Println(strings.HasSuffix(str,"帅"))// true
    fmt.Println(strings.HasSuffix(str,"丑"))//false
    fmt.Println("----------------")
    

    3 是否包含....
    Contains(str,"....")

    fmt.Println(strings.Contains(str,"真的"))//ture
    fmt.Println(strings.Contains(str,"假的"))//false
    fmt.Println("----------------")
    

    4 是否包含...中任意字符
    ContainsAny(str,"....")

    fmt.Println(strings.ContainsAny(str,"真的"))
    fmt.Println(strings.ContainsAny(str,"你的"))
    fmt.Println("----------------")
    

    5 查找...的第一次出现的索引
    Index(str,"....")

    fmt.Println(strings.Index(str,"假的"))//-1
    fmt.Println(strings.LastIndex(str,"真的"))//22
    fmt.Println(strings.LastIndex(str,"1"))//-1
    fmt.Println("----------------")
    

    6 查找...的最后一次出现的索引
    LastIndex(str,"....")

    fmt.Println("----------------")
    fmt.Println(strings.LastIndex(str,""))//33
    fmt.Println("----------------")
    

    7 替换
    Replace(str,oldstr,newstr,n)

    fmt.Println(strings.Replace(str,"真的","超级",1))//我超级真的真的真的很帅
    fmt.Println(strings.Replace(str,"真的","超级",2))//我超级超级真的真的很帅
    fmt.Println(strings.Replace(str,"真的","超级",-1))//我超级超级超级超级很帅
    fmt.Println("----------------")
    

    8 统计字符串出现次数
    Count(str,"...")

    fmt.Println(strings.Count(str,"真的"))//4
    fmt.Println(strings.Count(str,""))//12
    fmt.Println(strings.Count(str,"dsb"))//0
    fmt.Println("字符个数:",strings.Count(str,"")-1)//11
    

    9 大小写转换
    ToUpper(str)/ToLower(str)

    str2 := "老s王dSB abs BS"
    fmt.Println(strings.ToUpper(str2))//老S王DSB ABS BS
    fmt.Println(strings.ToLower(str2))//老s王dsb abs bs
    fmt.Println(strings.ToTitle(str2))//老S王DSB ABS BS
    

    10 去除指定字符(首/尾)
    Trim(str,"...")
    TrimLeft()
    TrimRight()
    TrimSpace(str)

    11 分割
    Split(str,"...") 根据指定分隔符号,转成切片[a b c d]
    ```go
    str4:="a,b,c,d"
    fmt.Println(strings.Split(str4,","))//[a b c d]

    
    12  拼接
    	Join(字符串切片,"拼接符")
    ```go
        myslice := strings.Split(str4,",") 
    	fmt.Println(strings.Join(myslice,"@"))//a@b@c@d
    
  • 相关阅读:
    LeetCode | Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode | Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode | Binary Tree Zigzag Level Order Traversal
    PLI与Pillow
    CentOS下安装setuptools、pip和virtualenv
    CentOS下更新python版本
    CentOS中输入yum报错:sudo: unable to execute /bin/yum: No such file or directory
    Python中pip版本升级error:You are using pip version 7.1.2, however version 8.1.1 is available.
    CentOS安装git
    CentOS中yum安装软件时报错:No package XXX available
  • 原文地址:https://www.cnblogs.com/gongcheng-/p/10872140.html
Copyright © 2011-2022 走看看