Golang Quick Start

这两天在学习G语言, 在看了go指南和一份go crash course的视频之后, 写代码试了试

 

go程序从main包下面的main函数开始执行

package main

 

导入其他的包

import (
	"fmt"
	"math"
	"strconv"
)

  

定义一个结构体, go语法上没有复杂的对象继承关系

type Person struct {
	name string
	age int
}

  

类型别名

// use a alias name for person
type Teacher Person

  

使用变量, 可以用:= 初始化并且声明一个变量, 但是不能在函数外面使用这个技巧

func variable_01() {
	age := 20
	msg := "this is a message from jack whose age is " + strconv.Itoa(age)
	fmt.Println(msg)
}

  

由于go是由包构成的程序, 区分包内对外开放的成员的方法是, 以大写字母开头的成员是对外开放的

// in go language, only Capitalized member will be exported to other package
func exportName_03() {
	fmt.Println("this is PI :", math.Pi)
}

  

函数的返回值可以是多个

// function can return more than one return value
func greaterThanYourNumber_04(yournumber int) (number int, err error) {
	return yournumber+1, nil;
}

  

函数参数类型的省略规则

// this function could use to swap two int number
func functionOmitType_05(a, b int) (c, d int)  {
	c, d = b, a
	return
}

  

未初始化的变量会自动给默认值

// use some variables that is not initialized
func useUnInitializedNumber_06()  {
	var aint int
	var afloat float64
	var abool bool
	var astring string
	fmt.Println(aint, afloat, abool, astring)
}

  

类型转换. go在赋值的过程中不会进行隐形的类型转换, 除了`:=`这样的短声明

// type cast
func typeCast_07()  {
	// we have a float32 number, by default a decimal literal should be float64
	decimal := 300.0
	fmt.Printf("%T\n", decimal)

	var afloat32 float32
	afloat32 = 200.0 // it works
	fmt.Println(afloat32)

	aint := 200
	afloat32 = float32(aint)
}

  

使用常量

// const
// go use capitalized word to indicate a const instead of all upper case
func constValues_08() {
	const BigNumber = 1 << 200
	//fmt.Println("big number:", BigNumber)
	//# command-line-arguments
	//.\main.go:74:14: constant 1606938044258990275541962092341162602522202993782792835301376 overflows int
}

  

只有一种for循环

// there is only one kind of loop in go
func forLoop_09()  {
	// like normal for loop in other language
	// but we can't add a () pair on the condition expression
	fmt.Println("--- normal for loop")
	for i := 0; i < 10; i++ {
		fmt.Println(i)
	}

	fmt.Println("--- like a while loop")
	sum := 0
	i := 0
	for sum != 55 {
		i += 1
		sum += i
	}
	fmt.Println("from 1 adds to", i, "the sum will equals 55")

	// infinite loop
	//for {
	//	// do nothing
	//}
}

  

if语句也有初始化部分

// if statement could have a initalize expression, and this variable could be used in else statement
func ifStatement_10() {
	// we could not use a `,` to separate several variable short declaration
	if i := 100; i < 10 {
		fmt.Println("100 < 10")
	} else {
		// we can access the variable i in this position
		fmt.Println(i, "<", 10)
	}
	// but we could do this
	var a, b int
	if a, b = 100, 10; a < b {

	}
	// may we can do this
	if a, b := 100, 10; a > b {

	}
}

  

switch的默认值

// use switch statement
func useSwitch_11()  {

	fmt.Println("--- use switch statement")
	expr := 100
	switch expr {
	case 100:
		fmt.Println(100)
		fmt.Println("case will not go down even there is no break statement")
	case 200:
		fmt.Println(200)
	default:
		fmt.Println("nothing")
	}

	fmt.Println("--- use switch's default value true")

	switch {
	case true:
		fmt.Println("swith's default value is true, if there is no expression")
	case false:
		fmt.Println("this shouldn't appear on the screen")
	default:
		fmt.Println("default shouldn't appear on the screen")
	}

	fmt.Println("--- switch's flow")
	switch 1 {
	default:
		fmt.Println("default 3 2 1")
	case 3:
		fmt.Println(3)
	case getTwo():
		fmt.Println(2)
	case 1:
		fmt.Println(1)
	}
}

  

defer可以推迟在函数块退出之后执行, 而defer的对象必须是函数调用, 函数参数的值立即计算

// use defer
func useDefer_12() {

	num := 100
	defer fmt.Println("1. defer num:", num)
	defer fmt.Println("2. defer num:", num)
	defer fmt.Println("3. defer num:", num)

	// expression in defer must be function call
	//defer two:= getTwo()
	num = 200
	fmt.Println("num is", num)
}

  

使用指针, 指针只有解引用运算, 没有+法运算

func usePointer_13() {

	num := 200
	p := &num
	fmt.Println("p's value is", *p, "p's address is", p)

	type Person struct {
		name string
		age int
	}

	// operate + not defined on *int, or something else
	//p = p + p
	//p += 1
	//p++
	//++p

	pointerToPerson := &Person{"jack", 18}
	fmt.Println("without explicit dereference", pointerToPerson)
	fmt.Println("[explicit dereference] *pointerToPerson:", *pointerToPerson)
	fmt.Println("[implicit dereference] pointerToPerson.name:", pointerToPerson.name)

}

  

函数块内也可以定义结构体

func useStruct_14() {

	type Vertex struct {
		x, y int
	}

	fmt.Println(Vertex{x:100})
}

  

数组的使用, 数组语法上无法改变大小,但是可以绕过

// array's declaration and initialization
func useArray_15() {

	{
		var array [3] string;

		array[0] = "jack";
		array[1] = "unname";
		array[2] = "go"
		fmt.Println(array)
	}

	{
		array := [3]int{1, 2, 3}
		fmt.Println(array)
	}

}

  

切片的使用

// slice and slice on slice
func useSlice_16() {
	fmt.Println("--- Make slice")
	// make slice
	{
		var emptySlice []int
		fmt.Println("emptySlice should be nil", emptySlice == nil, "capacity and lenth are 0")
		//fmt.Println("try to access a invalid index will cause panic", emptySlice[1])

		ints := make([]int, 10)
		fmt.Println("ints's capacity is", cap(ints), "lenght is", len(ints))
		for i := range ints {
			fmt.Printf("%d\t" , i)
		}
		// it's capacity will increase as the append function be called
		fmt.Println()
	}

	fmt.Println("--- Use slice")
	// use slice
	{
		ints := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
		// array's slice
		slice01 := ints[1: 5]// 2, 3, 4, 5
		fmt.Println(slice01)
		// slice on slice
		slice02 := slice01[1:3] // 3, 4
		fmt.Println(slice02)
		// change element
		slice02[0] = 100 // 3 should be place with 100
		fmt.Println(ints)

		slice02 = append(slice02, 200)
		fmt.Println(ints) // [1 2 100 4 200 6 7 8 9]
	}
}

  

 

全部代码:

package main

// import strconv for integer to string
// go language does not support the + operator for two diffrent type
import (
	"fmt"
	"math"
	"strconv"
)

type Person struct {
	name string
	age int
}

// use a alias name for person
type Teacher Person

func variable_01() {
	age := 20
	msg := "this is a message from jack whose age is " + strconv.Itoa(age)
	fmt.Println(msg)
}

// we usually can use type to give a alias name to a type
func alias_02() {
	jack := Teacher{name:"jack", age:22}
	fmt.Println(jack)
}

// in go language, only Capitalized member will be exported to other package
func exportName_03() {
	fmt.Println("this is PI :", math.Pi)
}

// function can return more than one return value
func greaterThanYourNumber_04(yournumber int) (number int, err error) {
	return yournumber+1, nil;
}

// this function could use to swap two int number
func functionOmitType_05(a, b int) (c, d int)  {
	c, d = b, a
	return
}

// use some variables that is not initialized
func useUnInitializedNumber_06()  {
	var aint int
	var afloat float64
	var abool bool
	var astring string
	fmt.Println(aint, afloat, abool, astring)
}

// type cast
func typeCast_07()  {
	// we have a float32 number, by default a decimal literal should be float64
	decimal := 300.0
	fmt.Printf("%T\n", decimal)

	var afloat32 float32
	afloat32 = 200.0 // it works
	fmt.Println(afloat32)

	aint := 200
	afloat32 = float32(aint)
}

// const
// go use capitalized word to indicate a const instead of all upper case
func constValues_08() {
	const BigNumber = 1 << 200
	//fmt.Println("big number:", BigNumber)
	//# command-line-arguments
	//.\main.go:74:14: constant 1606938044258990275541962092341162602522202993782792835301376 overflows int
}

// there is only one kind of loop in go
func forLoop_09()  {
	// like normal for loop in other language
	// but we can't add a () pair on the condition expression
	fmt.Println("--- normal for loop")
	for i := 0; i < 10; i++ {
		fmt.Println(i)
	}

	fmt.Println("--- like a while loop")
	sum := 0
	i := 0
	for sum != 55 {
		i += 1
		sum += i
	}
	fmt.Println("from 1 adds to", i, "the sum will equals 55")

	// infinite loop
	//for {
	//	// do nothing
	//}
}

// if statement could have a initalize expression, and this variable could be used in else statement
func ifStatement_10() {
	// we could not use a `,` to separate several variable short declaration
	if i := 100; i < 10 {
		fmt.Println("100 < 10")
	} else {
		// we can access the variable i in this position
		fmt.Println(i, "<", 10)
	}
	// but we could do this
	var a, b int
	if a, b = 100, 10; a < b {

	}
	// may we can do this
	if a, b := 100, 10; a > b {

	}
}

// use switch statement
func useSwitch_11()  {
	fmt.Println("--- use switch statement")
	expr := 100
	switch expr {
	case 100:
		fmt.Println(100)
		fmt.Println("case will not go down even there is no break statement")
	case 200:
		fmt.Println(200)
	default:
		fmt.Println("nothing")
	}

	fmt.Println("--- use switch's default value true")

	switch {
	case true:
		fmt.Println("swith's default value is true, if there is no expression")
	case false:
		fmt.Println("this shouldn't appear on the screen")
	default:
		fmt.Println("default shouldn't appear on the screen")
	}

	fmt.Println("--- switch's flow")
	switch 1 {
	default:
		fmt.Println("default 3 2 1")
	case 3:
		fmt.Println(3)
	case getTwo():
		fmt.Println(2)
	case 1:
		fmt.Println(1)
	}
}

func getTwo() int {
	return 2;
}

// use defer
func useDefer_12() {

	num := 100
	defer fmt.Println("1. defer num:", num)
	defer fmt.Println("2. defer num:", num)
	defer fmt.Println("3. defer num:", num)

	// expression in defer must be function call
	//defer two:= getTwo()
	num = 200
	fmt.Println("num is", num)
}

func main() {

	// 01, variable
		//variable_01()

	// 02.struct alias name
		//alias_02()

	// 03.export name
		//exportName_03()

	// 04. use function
		//number := 200
		//fmt.Println("your number is set to", number)
		//newNumber, _ := greaterThanYourNumber(number)
		//fmt.Println("But, my number would be ", newNumber)

	// 05. omit parameter type or return type
		//a, b := 0, 1
		//a, b = functionOmitType_05(a, b)
		//fmt.Println(a, b)

	// 06. use values without initialize
		//useUnInitializedNumber_06()

	// 07. type cast,sometimes go language won't do implicit type cast sometimes
		//typeCast_07()

	// 08. use const values
		//constValues_08()

	// 09. for loop
		//forLoop_09()

	// 10. if statement
		//ifStatement_10()

	// 11. use switch
		//useSwitch_11()

	// 12. defer
		//useDefer_12()

	// 13. pointer
		//usePointer_13()

	// 14. use struct, we can define a struct in method, but we can not define the corresponded method receiver
		//useStruct_14()

	// 15. use array, example: array := [3]int{1, 2, 3}
		//useArray_15()

	// 16. use slice
		useSlice_16()

	// 17.

}

// slice and slice on slice
func useSlice_16() {
	fmt.Println("--- Make slice")
	// make slice
	{
		var emptySlice []int
		fmt.Println("emptySlice should be nil", emptySlice == nil, "capacity and lenth are 0")
		//fmt.Println("try to access a invalid index will cause panic", emptySlice[1])

		ints := make([]int, 10)
		fmt.Println("ints's capacity is", cap(ints), "lenght is", len(ints))
		for i := range ints {
			fmt.Printf("%d\t" , i)
		}
		// it's capacity will increase as the append function be called
		fmt.Println()
	}

	fmt.Println("--- Use slice")
	// use slice
	{
		ints := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
		// array's slice
		slice01 := ints[1: 5]// 2, 3, 4, 5
		fmt.Println(slice01)
		// slice on slice
		slice02 := slice01[1:3] // 3, 4
		fmt.Println(slice02)
		// change element
		slice02[0] = 100 // 3 should be place with 100
		fmt.Println(ints)

		slice02 = append(slice02, 200)
		fmt.Println(ints) // [1 2 100 4 200 6 7 8 9]
	}
}

// array's declaration and initialization
func useArray_15() {

	{
		var array [3] string;

		array[0] = "jack";
		array[1] = "unname";
		array[2] = "go"
		fmt.Println(array)
	}

	{
		array := [3]int{1, 2, 3}
		fmt.Println(array)
	}

}

func useStruct_14() {

	type Vertex struct {
		x, y int
	}

	fmt.Println(Vertex{x:100})
}

func usePointer_13() {

	num := 200
	p := &num
	fmt.Println("p's value is", *p, "p's address is", p)

	type Person struct {
		name string
		age int
	}

	// operate + not defined on *int, or something else
	//p = p + p
	//p += 1
	//p++
	//++p

	pointerToPerson := &Person{"jack", 18}
	fmt.Println("without explicit dereference", pointerToPerson)
	fmt.Println("[explicit dereference] *pointerToPerson:", *pointerToPerson)
	fmt.Println("[implicit dereference] pointerToPerson.name:", pointerToPerson.name)

}


// we can not use short declaration variable in this place
//aNumber := 100

// data types
/*
	bool

	string

	int  int8  int16  int32  int64
	uint uint8 uint16 uint32 uint64 uintptr

	byte // uint8's alias

	rune // int32's alias unicode

	float32 float64

	complex64 complex128
*/

  

posted @ 2019-04-13 23:20  不怕旅途多坎坷  阅读(413)  评论(0编辑  收藏  举报