文章会有【原创】或者【转载】标示,部分来自Google Baidu的学习结果 {Java/PHP/Python/Ruby/Go}

Go再学习一【原创】  


学习Go


1):没有“对象”,没有继承多态,没有泛型,没有try/catch

2):有接口,函数式编程,CSP并发编程(goruntime + channel);

基本语法:

1):变量

2):选择,循环

3):指针、数组、容器;

面向接口:

1):结构体

函数式编程:

1):闭包

工程化:

1):错误处理、资源管理

并发编程:

1):调度器

2):goruntime + channel


Go基础语法:


package main


import(

"fmt"

)


var a int

var b string


/*

var (

aa = 3

bb = "shanxi"

)

 */


func main() {

a = 100 // global variable

b = "go"

fmt.Println("hello world")

fmt.Printf("%s --- %d\n", b, a)


var aa, bb, cc = 100, "china", true

fmt.Printf("%d --- %s --- %t\n", aa, bb, cc)


aaa, bbb, ccc := 200, "beijing", false

aaa = 600

fmt.Printf("%d --- %s --- %t\n", aaa, bbb, ccc)

}


内建变量类型


1):bool string

2):(u)int (u)int8,(u)int16,(u)int32,(u)int64uintptr【指针】

3):byte rune【字符型】

4):float32 float64 complex64complex128 【复数】


package main


import(

"fmt"

"math/cmplx"

"math"

)


/*

欧拉公式

import cmath

cmath.exp(1j * cmath.pi) + 1

pow(cmath.e, 1j * cmath.pi) + 1

1.2246467991473532e-16j

 */

func main() {

c := 3 + 4i

fmt.Println(cmplx.Abs(c))

fmt.Println(cmplx.Exp(1i * math.Pi) + 1)

fmt.Println(cmplx.Pow(math.E, 1i * math.Pi) + 1) // 不是绝对0

}



强制类型转换

类型转换是强制的

func triangle() {

var a, b int = 3, 4

var c int

c = int(math.Sqrt(float64(a * a + b * b)))

fmt.Println(c)

}


常量的定义

const filename string = "abc.txt"

const a, b, c  = 1, 2, 3 //可以是int float


func enums() {

const(

java = iota

_

python

php

)

fmt.Println(java, python, php)

}


条件不需要括号!!!!!


package main


import (

"fmt"

"io/ioutil"

)


func main() {


const filename = "test.log"

constent, err := ioutil.ReadFile(filename)

if err != nil {

fmt.Println(err)

} else {

fmt.Printf("%s\n", constent)

}


// constent1 生命周期在if里面

if constent1, err := ioutil.ReadFile(filename); err != nil {

fmt.Println(err)

} else {

fmt.Printf("%s\n", constent1)

}

}


switch 会自动break

switch 后可以没有表达式;

func eval(score int) string {

var g string =  ""

switch {

case score < 60:

g = "f"

case score < 80:

g = "c"

case score < 90:

g = "b"

default:

panic(fmt.Sprintf("wrong %d", score))

}

return g

}

fmt.Println(eval(100))


for 不能有括号

func fortest() int {

sum := 0

for i := 0; i <= 100; i++ {

sum += i

}


return sum

}


func converToBin(n int) string {

result := ""

for ; n > 0; n /= 2 {

lsb := n % 2

result = strconv.Itoa(lsb) + result

}

return result

}


func printFile(filename string) {

file, err := os.Open(filename)

if err != nil {

panic(err)

}


scanner:= bufio.NewScanner(file)


for scanner.Scan()  {

fmt.Println(scanner.Text())

}

}


没有while


函数是一等公民

package main


import (

"fmt"

"reflect"

"runtime"

"math"

)


// 多返回多值

func div(a, b int) (q, r int, err error) {

if a == 0 || b == 0 {

return 0, 0, fmt.Errorf("number error")

}

return a / b, a % b, nil

}


func apply(op func(float64, float64) float64, a, b float64) float64 {

p := reflect.ValueOf(op).Pointer()

opNname := runtime.FuncForPC(p).Name()

fmt.Printf("call func %s with args (%f, %f) ", opNname, a ,b)

return op(a, b)

}


func main() {

if q, r, err := div(13, 3); err != nil {

fmt.Println(err)

} else {

fmt.Println("----", q, r)

}

fmt.Println(apply(math.Pow,3.02, 4.02))

}


1):返回值类型写在最后面;

2):可返回多个值;

3):函数作为参数;

4):没有默认参数 可选参数;


指针:

指针不能运算

什么叫 值传递 引用传递

// 指针

func swap(a, b *int) {

*a, *b = *b, *a

}


a , b := 5, 10

swap(&a, &b) // 取地址

fmt.Println(a, b)



数组,切片, 容器

[10]int [20]int 是不同类型

调用func f(arr [10]int) 会拷贝数组,值传递 **********

go语言中一般不直接使用数组

var arr1 [5]int

arr2 := [3]int{1, 3, 5}

arr3 := [...]int{2, 4 ,5 ,6}

var grid [4][5]bool

fmt.Println(arr1, arr2, arr3, grid)


for i := 0; i < len(arr2); i++ {

fmt.Println(arr2[i])

}


for k, v := range(arr2) {

fmt.Println(k, "---", v)

}