第一个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\n", 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 \n \r xx
   `
	fmt.Println("str2=",str2)
}


//123 64
//int
//12
//float64
//true
//bool
//97
//ch = a108
//str2= hello
//luhan \n \r xx

5. fmt包的使用

输出:

//package 声明开头表示代码所属包
package main

import "fmt"


func main() {
	//整型
	a := 15
	//%b:二进制
	fmt.Printf("a = %b\n",a)
	//只输出一个%
	fmt.Printf("%%\n")

	//字符
	ch := 'a'
	fmt.Printf("ch = %c,%d\n",ch,97)

	//浮点
	f := 3.14
	//%g紧凑方式输出
	fmt.Printf("f = %f,%g\n",f,f)

	//布尔型
	fmt.Printf("%t,%t\n",true,false)

	//字符串
	str := "hello.go"
	fmt.Printf("str = %s\n",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; 是一个指针变量
    
posted @ 2019-04-13 23:38  孔辉  阅读(474)  评论(0编辑  收藏  举报