文章目录

1.数据类型
package main

import "fmt"

func main()  {

	//布尔
	fmt.Println("-------------布尔-------------")
	var bool_test = true
	fmt.Println("var bool_test = true  >>  ",bool_test)

	//数字
	fmt.Println("-------------数字-------------")
	var num1 int = 1 // var num1 int8/16/32/64
	fmt.Println("var num1 = 1  >>  ",num1)

	//字符串
	fmt.Println("-------------字符串-------------")
	var str = "我是一个字符串"
	fmt.Println("var str = \"我是一个字符串\"  >>  ",str)
	
}
2.变量和常量

1.变量

package main


//var a = "菜鸟教程"
//var b string = "runoob.com"
//var c bool

var x, y int
var (  // 这种因式分解关键字的写法一般用于声明全局变量
	a int
	b bool
)
var c, d int = 1, 2
var e, f = 123, "hello"


func main() {
	//变量声明
	//第一种,指定变量类型,声明后若不赋值,使用默认值。
	var v_name v_type
	v_name = value
	//第二种,根据值自行判定变量类型。
	var v_name = value
	//第三种,省略var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误。
	v_name := value
	//
	 例如
	var a int = 10
	var b = 10
	c := 10

	print(a,b,c)

//=================================================

	类型相同多个变量, 非全局变量
	//var vname1, vname2, vname3 type
	//	vname1, vname2, vname3 = v1, v2, v3
	//var vname1, vname2, vname3 = v1, v2, v3 //和python很像,不需要显示声明类型,自动推断
	//vname1, vname2, vname3 := v1, v2, v3 //出现在:=左侧的变量不应该是已经被声明过的,否则会导致编译错误
	 这种因式分解关键字的写法一般用于声明全局变量
	var (
		vname1 v_type1
		vname2 v_type2
	)


	g, h := 123, "hello"
	println(x, y, a, b, c, d, e, f, g, h)
}



2.常量

package main

import "fmt"

func main() {

	const LENGTH int = 10
	const WIDTH int = 5
	var area int
	const a, b, c = 1, false, "str" //多重赋值
	area = LENGTH * WIDTH
	fmt.Printf("面积为 : %d", area)
	println()
	println(a, b, c)


}

3.条件和循环

1.if判断

package main

import "fmt"

func main() {

	var flag = 1
	if flag == 1{
		fmt.Println("input 1")
	}else if flag == 2{
		fmt.Println("input 2")
	}else {
		fmt.Println("error")
	}


}

2.switch判断

package main

import "fmt"

func main() {
	/* 定义局部变量 */
	var grade string = "B"
	var marks int = 90

	switch marks {
	case 90: grade = "A"
	case 80: grade = "B"
	case 50,60,70 : grade = "C"
	default: grade = "D"
	}

	switch {
	case grade == "A" :
		fmt.Printf("优秀!\n" )
	case grade == "B", grade == "C" :
		fmt.Printf("良好\n" )
	case grade == "D" :
		fmt.Printf("及格\n" )
	case grade == "F":
		fmt.Printf("不及格\n" )
	default:
		fmt.Printf("差\n" );
	}
	fmt.Printf("你的等级是 %s\n", grade );
}

3.for循环

package main

import "fmt"

func main() {

	var flag = 10
	var i = 0
	for i <flag {
		i++
		fmt.Print(i)
	}
}

4.函数

1.普通函数

package main

import "fmt"

func main() {

	fmt.Print(max(1,2))
}

/* 函数返回两个数的最大值 */
func max(num1, num2 int) int {
	/* 声明局部变量 */
	var result int

	if (num1 > num2) {
		result = num1
	} else {
		result = num2
	}
	return result
}

2.多返回值函数

package main

import "fmt"

func main() {

	s, i := show("cxl")
	fmt.Print(s,i)
}

func show(name string)(string,string){

	return "你输入的是"+name,"你好"+name
}

5.数组和指针

1.数组

package main

import "fmt"

func main() {
	var i int

	var arr = [3] int {1,2,3}
	fmt.Print(arr)

	//可变长度数组
	var arr2 = [...] int {1,2,3,4,5,6,7}
	fmt.Print(arr2)

	//遍历
	for i = 0;i< len(arr2);i++ {
		fmt.Println(arr2[i])
	}

}

2.指针

package main

import "fmt"

func main() {

	//一个指针变量指向了一个值的内存地址。
	//类似于变量和常量,在使用指针前你需要声明指针。指针声明格式如下:
	//var var_name *var-type

	var a int = 1

	fmt.Printf("变量的地址: %x\n", &a)



}
6.结构体和切片

1.结构体

package main

import "fmt"

type Books struct {
	title string
	author string
	subject string
	book_id int
}
func main() {

	// 创建一个新的结构体
	fmt.Println(Books{"Go 语言", "www.runoob.com", "Go 语言教程", 6495407})

	// 也可以使用 key => value 格式
	fmt.Println(Books{title: "Go 语言", author: "www.runoob.com", subject: "Go 语言教程", book_id: 6495407})

	// 忽略的字段为 0 或 空
	fmt.Println(Books{title: "Go 语言", author: "www.runoob.com"})

}

2.切片

package main

import "fmt"

func main() {

	var numbers = make([]int,3,5)

	printSlice(numbers)

}

func printSlice(x []int){
	fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
7.集合
package main

import "fmt"

func main() {

	var countryCapitalMap map[string]string /*创建集合 */
	countryCapitalMap = make(map[string]string)

	/* map插入key - value对,各个国家对应的首都 */
	countryCapitalMap [ "France" ] = "Paris"
	countryCapitalMap [ "Italy" ] = "罗马"
	countryCapitalMap [ "Japan" ] = "东京"
	countryCapitalMap [ "India " ] = "新德里"

	/*使用键输出地图值 */
	for country := range countryCapitalMap {
		fmt.Println(country, "首都是", countryCapitalMap [country])
	}

	delete(countryCapitalMap,"India")
	fmt.Println("delete-------------------")
	fmt.Println(countryCapitalMap [ "India " ])

	/*查看元素在集合中是否存在 */
	captial, ok := countryCapitalMap [ "美国" ] /*如果确定是真实的,则存在,否则不存在 */
	/*fmt.Println(captial) */
	/*fmt.Println(ok) */
	if (ok) {
		fmt.Println("美国的首都是", captial)
	} else {
		fmt.Println("美国的首都不存在")
	}



}

8.并发
package main

import (
	"fmt"
	"time"
)

func say(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
	go say("1")
	go say("2")
	say("3")
}
9.通道
package main

import "fmt"

func main() {

	ch := make(chan int,2)

	ch <- 1
	ch <- 2

	fmt.Println(<-ch)
	fmt.Println(<-ch)



}
练习

1.九九乘法表

package main

import "fmt"

var(
	i int
)

func main() {
	var i int
	for i = 0;i<10;i++{
		fmt.Printf("%d\t",get(i))
	}
}

func get(n int) int {
	if n < 2{
		return n
	}
	return  get(n-2)+get(n-1)
}

2.(简陋)计算器

package main

import "fmt"

var (
	addNumer1 float64
	addNumber2 float64
	cellNumber1 float64
	cellNumber2 float64
	chenNumber1 float64
	chenNumber2 float64
	chuNumber1 float64
	chuNumber2 float64
	flag int //判断类型
)

func main() {

	for true{
		fmt.Println("1.加 2.减 3.乘 4.除")
		fmt.Scanln(&flag)
		switch flag {
		case 1:
			fmt.Println("input add1")
			fmt.Scanln(&addNumer1)
			fmt.Println("input add2")
			fmt.Scanln(&addNumber2)
			fmt.Printf("%x + %x = %x ",addNumer1,addNumber2,addNumer1+addNumber2)
			fmt.Println("")
		case 2:
			fmt.Println("input cell1")
			fmt.Scanln(&cellNumber1)
			fmt.Println("input cell2")
			fmt.Scanln(&cellNumber2)
			fmt.Printf("%x - %x = %x ",cellNumber1,cellNumber2,cellNumber1-cellNumber2)
			fmt.Println("")
		case 3:
			fmt.Println("input chen1")
			fmt.Scanln(&chenNumber1)
			fmt.Println("input chen2")
			fmt.Scanln(&chenNumber2)
			fmt.Printf("%x * %x = %x ",chenNumber1,chenNumber2,chenNumber1*chenNumber2)
			fmt.Println("")
		case 4:
			fmt.Println("input add1")
			fmt.Scanln(&chuNumber1)
			fmt.Println("input add2")
			fmt.Scanln(&chuNumber2)
			fmt.Printf("%x / %x = %x ",chuNumber1,chuNumber2,chuNumber1/chuNumber2)
			fmt.Println("")
		default:
			fmt.Println("error")
			break
	}

	}


}

3.斐波那契数列

package main

import "fmt"

var(
	i int
)

func main() {
	var i int
	for i = 0;i<10;i++{
		fmt.Printf("%d\t",get(i))
	}
}

func get(n int) int {
	if n < 2{
		return n
	}
	return  get(n-2)+get(n-1)
}