• 第一个go程序和基本语法


    第一个go程序和基本语法

    一. 第一个go程序

    //package 声明开头表示代码所属包
    package main
    
    //导入格式化包,引了必须用
    import "fmt"
    
    //左括号{不能单起一行
    func main(){
    	fmt.Println("Go Lang, 开始浪吧~")
    }
    
    //  "//"表示单行注释
    //  "*/ */"表示多行注释
    

    二. 基础语法

    1. 命名

    • go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则

    • 一个名字必须以一个字母或下划线开头,后面可以跟任意数量的字母、数字或下划线

    • go区分大小写,hello和Hello不一样

    • go语言中有25个关键字,不能用于自定义名字

        break        default          func           interface         select
        case         defer            go             map               struct
        chan         else             goto           package           switch
        const        fallthrough      if             range             type
        continue     for              import         return            var
      
    • 还有30多个预定义的名字,用于内建的常量、类型和函数

      内建常量:
          true false iota nil
      
      内建类型:
          int int8 int16 int32 int64
          uint uint8 uint16 uint32 uint64 uintptr
          float32 float64 complex128 complex64
          bool byte rune string error
      
      内建函数:
          make len cap new append copy close delete
          complex real imag
          panic recover
      

    2. 变量

    2.1 声明变量:

    //package 声明开头表示代码所属包
    package main
    
    import "fmt"
    
    func main() {
    	//第一种:
    	var v1 int
    	var v2 int
    
    	//第二种:
    	var v3, v4 int
    
    	//第三种
    	var(
    		v5 int
    		v6 int
    	)
    
    	//零值
    	fmt.Println(v1, v2, v3, v4, v5, v6)
    
    }
    

    2.2 变量初始化

    //package 声明开头表示代码所属包
    package main
    
    import (
    	"fmt"
    	"reflect"
    )
    
    func main() {
    	//方式一:
    	var v1 int = 10
    
    	//方式二:go编译器自动推到出变量类型
    	var v2 = 20
    
    	//方式三:声明加赋值, 必须在函数里面用
    	v3 := 30
    
    	fmt.Println(v1, v2, v3)
    
    	//利用反射查看变量类型
    	fmt.Println("v3的类型是", reflect.TypeOf(v3))
    }
    
    
    
    //10 20 30	
    //v3的类型是 int
    

    2.3 变量赋值

    //package 声明开头表示代码所属包
    package main
    
    import "fmt"
    
    func main() {
    	//1. 直接赋值
    	var v1 int
    	v1 = 123
    
    	//2. 声明并赋值
    	i := 10
    	j :=20
    
    	//3. 多重赋值
    	var v2, v3, v4 int
    	v2, v3, v4 = 1, 2, 3
    	
    	fmt.Println(v1, v2, v3, v4, i, j)
    }
    

    匿名变量:

    //package 声明开头表示代码所属包
    package main
    
    import "fmt"
    
    //(int, sting): 返回值类型
    func test()(int, string){
    	return 666,"浪不浪"
    }
    
    
    func main() {
    	// "_"是特殊变量, 占位
    	_, s1 := test()
    	fmt.Println(s1)
    
    	a1, s1 := test()
    	fmt.Println(a1,s1)
    }
    
    
    //浪不浪
    //666 浪不浪
    

    .

    //package 声明开头表示代码所属包
    package main
    
    import "fmt"
    
    var abc = 456
    
    func main() {
    	//定义
    	var a int
    	var s string
    	fmt.Println(a,s)
    	
    	fmt.Printf("%d %q
    ", a,s)
    
    	//定义多个
    	var c,b int = 3,4
    	fmt.Println(c,b)
    
    	//不指定类型定义, 可以写一行
    	j,k,q :=3,true,"xx"
    	fmt.Println(j,k,q)
    }
    
    
    //0 
    //0 ""
    //3 4
    //3 true xx
    

    3 常量与枚举

    //package 声明开头表示代码所属包
    package main
    
    import "fmt"
    
    //常量 const
    const filename = "luhan.txt"
    
    ////常量必须是可确定的数字, 字符串, 布尔值
    //var a = "haha"
    //const file2  = a
    
    //定义函数, 函数内写常量
    func consts() {
    	//多个常量
    	const (
    		XX       = "haha1"
    		OO       = "haha2"
    		filename = "haha3"
    	)
    	fmt.Println(XX, OO, filename)
    }
    
    //1. 定义枚举类型
    func enums() {
    	const (
    		python = 0
    		java   = 1
    		golang = 2
    	)
    	fmt.Println(python, java, golang)
    }
    
    //2. 自增的枚举类型
    func enums1() {
    	const (
    		//iota关键字是自增
    		pyhton = iota
    		java
    		golang
    	)
    	fmt.Println(pyhton, java, golang)
    }
    
    //3. iota还可以参与计算
    func enums2() {
    	const (
    		//位运算, n*2(10*1), 2^0 = 1
    		b  = 1 << (10 * iota)
    		kb
    		mb
    		gb
    		tb
    		pb
    	)
    	fmt.Println(b, kb, mb, gb, tb, pb )
    }
    
    func main() {
    	consts()
    	enums1()
    	enums2()
    }
    
    
    //haha1 haha2 haha3
    //0 1 2
    //1 1024 1048576 1073741824 1099511627776 1125899906842624
    

    4. 数据类型

    • u开头是无符号类型

    • 8,16,32这些,最大最用是增加可移植性和维护性

    • short int long

      类型名称	有无符号	bit数
      int8	Yes	8
      int16	Yes	16
      int32	Yes	32
      int64	Yes	64
      uint8	No	8
      uint16	No	16
      uint32	No	32
      uint64	No	64
      int	Yes	等于cpu位数
      uint	No	等于cpu位数
      rune	Yes	与 int32 等价
      byte	No	与 uint8 等价
      uintptr	No	-
      

    .

    //package 声明开头表示代码所属包
    package main
    
    import (
    	"fmt"
    	"reflect"
    )
    
    func main() {
    	//1.整型
    	var v1  int32
    	v1 = 123
    	v2 := 64
    	fmt.Println(v1,v2)
    	//默认是int
    	fmt.Println(reflect.TypeOf(v2))
    
    	//2.浮点型
    	var f1 float32
    	f1 = 12
    	fmt.Println(f1)
    	f2 := 12.0
    	fmt.Println(reflect.TypeOf(f2))
    
    	//3.布尔型
    	var b1 bool
    	b1 = true
    	fmt.Println(b1)
    	b2 := (1==2)
    	//打印类型
    	fmt.Println(reflect.TypeOf(b2))
    
    	//4.字符型
    	var ch byte
    	ch = 'a'
    	fmt.Println(ch)
    	fmt.Printf("ch = %c",ch)
    
    	//5.字符串
    	var str  string
    	str = "luhan"
    	s := str[0]
    	fmt.Println(s)
    	//反括号圈起来的字符串,原样输出
    	str2 := `hello
        luhan 
     
     xx
       `
    	fmt.Println("str2=",str2)
    }
    
    
    //123 64
    //int
    //12
    //float64
    //true
    //bool
    //97
    //ch = a108
    //str2= hello
    //luhan 
     
     xx
    

    5. fmt包的使用

    输出:

    //package 声明开头表示代码所属包
    package main
    
    import "fmt"
    
    
    func main() {
    	//整型
    	a := 15
    	//%b:二进制
    	fmt.Printf("a = %b
    ",a)
    	//只输出一个%
    	fmt.Printf("%%
    ")
    
    	//字符
    	ch := 'a'
    	fmt.Printf("ch = %c,%d
    ",ch,97)
    
    	//浮点
    	f := 3.14
    	//%g紧凑方式输出
    	fmt.Printf("f = %f,%g
    ",f,f)
    
    	//布尔型
    	fmt.Printf("%t,%t
    ",true,false)
    
    	//字符串
    	str := "hello.go"
    	fmt.Printf("str = %s
    ",str)
    }
    
    //a = 1111
    //%
    //ch = a,97
    //f = 3.140000,3.14
    //true,false
    //str = hello.go
    

    输入:

    //package 声明开头表示代码所属包
    package main
    
    import "fmt"
    
    func main() {
    	//用户输入内容, 程序接收
    	var v int
    
    	//Print是不回车
    	fmt.Print("请输入一个整型:")
    
    	//直接输入
    	//如果不是int,输出零值
    	fmt.Scan(&v)
    	fmt.Println(v)
    }
    
    //请输入一个整型:5
    //5
    

    6. 类型别名

    //package 声明开头表示代码所属包
    package main
    
    import (
    	"fmt"
    	"reflect"
    )
    
    func main() {
    	//type关键字定义别名
    	type myint int
    	var i myint = 100
    	fmt.Println(i)
    	fmt.Println(reflect.TypeOf(i))
    }
    
    //100
    //main.myint
    

    7. 类型转换

    go类型转换不允许隐式转换

    //package 声明开头表示代码所属包
    package main
    
    import "fmt"
    
    func main() {
    	var ch byte = 'a'
    	var i int = int(ch)
    	fmt.Println(ch)
    	fmt.Println(i)
    }
    
    //97
    //97
    

    8. 运算符

    • 算术运算符

        +	相加	A + B 输出结果 30
        -	相减	A - B 输出结果 -10
        *	相乘	A * B 输出结果 200
        /	相除	B / A 输出结果 2
        %	求余	B % A 输出结果 0
        ++	自增	A++ 输出结果 11
        --	自减	A-- 输出结果 9
      
    • 关系运算符

        ==	检查两个值是否相等,如果相等返回 True 否则返回 False。	(A == B) 为 False
        !=	检查两个值是否不相等,如果不相等返回 True 否则返回 False。	(A != B) 为 True
        >	检查左边值是否大于右边值,如果是返回 True 否则返回 False。	(A > B) 为 False
        <	检查左边值是否小于右边值,如果是返回 True 否则返回 False。	(A < B) 为 True
        >=	检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。	(A >= B) 为 False
        <=	检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。	(A <= B) 为 True
      
    • 逻辑运算符

        &&	逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。	(A && B) 为 False
        ||	逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。	(A || B) 为 True
        !	逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。	!(A && B) 为 True
      
    • 位运算符

        &	按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。	(A & B) 结果为 12, 二进制为 0000 1100
        |	按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或	(A | B) 结果为 61, 二进制为 0011 1101
        ^	按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。	(A ^ B) 结果为 49, 二进制为 0011 0001
        <<	左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。	A << 2 结果为 240 ,二进制为 1111 0000
        >>	右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。	A >> 2 结果为
      
    • 赋值运算符

        =	简单的赋值运算符,将一个表达式的值赋给一个左值	C = A + B 将 A + B 表达式结果赋值给 C
        +=	相加后再赋值	C += A 等于 C = C + A
        -=	相减后再赋值	C -= A 等于 C = C - A
        *=	相乘后再赋值	C *= A 等于 C = C * A
        /=	相除后再赋值	C /= A 等于 C = C / A
        %=	求余后再赋值	C %= A 等于 C = C % A
        <<=	左移后赋值	C <<= 2 等于 C = C << 2
        >>=	右移后赋值	C >>= 2 等于 C = C >> 2
        &=	按位与后赋值	C &= 2 等于 C = C & 2
        ^=	按位异或后赋值	C ^= 2 等于 C = C ^ 2
        |=	按位或后赋值	C |= 2 等于 C = C | 2
      
    • 其他

        &	返回变量存储地址	&a; 将给出变量的实际地址。
        *	指针变量。	*a; 是一个指针变量
  • 相关阅读:
    基本内置类型
    多维数组
    数组
    迭代器
    标准库类型 vector
    标准库类型 string
    运算符优先级表
    类型转换
    sizeof 和逗号运算符
    位运算符
  • 原文地址:https://www.cnblogs.com/konghui/p/10703583.html
Copyright © 2020-2023  润新知