go語言安裝與開發環境
下載:https://studygolang.com/dl 選擇相應的版本就好
基礎語法
-
變量定義
package main
import "fmt"
// 在函數外部不可以使用:=來定義變量
// 定義包內部變量
var ii = 11
// 定義包內部多個變量
var (
bb = true
ss = "hello world"
temp int = 123
)
func variable() {
// 聲明變量
var a int // 變量名在類型之前
var b string
fmt.Printf("%d %q \n", a, b)
// 賦初始值
var c, e int = 1, 4
var d string = "123"
fmt.Println(c, d, e) // 變量定義即需要使用
// 自動推斷類型
var g, f, h, i = 11, 44, true, "def"
fmt.Printf("%d %d %v %s \n", g, f, h, i) // 格式化輸出變量
// 初始化
j, k := 11, false
k = true // 初始化之後可以重新賦值
fmt.Printf("%d %v \n", j, k)
}
func main() {
// 定義變量儘量短一點,能:= 來處理就可以使用,但是:= 只可以在函數內部使用
variable()
fmt.Println("hello world", ii, bb, ss, temp)
}
-
內建變量類型
package main
import (
"fmt"
"math"
"math/cmplx"
)
func euler() {
fmt.Printf("%.3f \n", cmplx.Exp(1i*math.Pi)+1)
}
func triangle() {
var a, b int = 3, 4
var c int
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)
}
func main() {
/*
1.bool
2.string
3.int (u)int8 (u)int16 (u)int32 (u)int64 uintptr(指針) //加u爲無符號整形
4.byte 8位
5.rune 32位
6.float32 float64 comexpl64 comexpl128 comexpl爲複數 比如i=根號-1 i=3+4i 3爲實部 4i爲虛部首 後面聽不懂了 見諒
*/
// 歐拉公式驗證,使用複數
euler()
// 強制類型裝換
triangle()
}
-
常亮與枚舉
package main
import "fmt"
func consts() {
const (
fileNameID = "abc.txt"
a, b = 3, 4
)
fmt.Println(fileNameID, a, b)
}
func enums() {
// const ( //普通枚舉 可以用自增來簡寫
// cpp = 0
// java = 1
// python = 2
// golang = 3
// )
// 普通枚舉類型
const (
cpp = iota
java
_ // 代表一個元素
python
golang
javascript
)
// 更加複雜的const表達式使用iota 來表示 b kb mb gb tb pb
// 自增值枚舉類型
const (
b = 1 << (10 * iota)
kb
mb
gb
tb
pb
)
fmt.Println(cpp, java, python, golang, javascript)
fmt.Println(b, kb, mb, gb, tb, pb)
}
func main() {
// 自動判斷類型的變量在計算的時候纔會確定類型
// 聲明常量 常量可以作爲各種類型使用
consts()
// 枚舉類型
enums()
}
-
條件語句與循環
package main
import (
"bufio"
"fmt"
"io/ioutil"
"os"
"strconv"
)
func grage(score int) string {
g := ""
switch { // switch後面可以沒有表達式
case score < 0 || score > 100:
panic(fmt.Sprintf(
"Wrong score: %d", score))
case score < 60:
g = "f"
case score < 80:
g = "c"
case score < 90:
g = "b"
case score < 100:
g = "a"
}
return g
}
func converToBin(n int) string {
res := ""
for ; n > 0; n /= 2 {
lsb := n % 2
res = strconv.Itoa(lsb) + res
}
return res
}
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())
}
}
func forever() {
for {
fmt.Println("abc")
}
}
func main() {
const filename = "abc.txt"
// if語句裏可以賦值 但是條件裏賦值的變量作用域在if中 不可以在if外使用
if contents, err := ioutil.ReadFile(filename); nil != err {
fmt.Println(err)
} else {
fmt.Printf("%s \n", contents)
}
// switch
fmt.Println(grage(11))
// for 整數轉化爲二進制表達式
fmt.Println(converToBin(13))
printFile("abc.txt")
forever()
}
-
函數
package main
import (
"fmt"
"math"
"reflect"
"runtime"
)
func eval(a, b int, op string) (int, error) { //返回多個值,error用來判斷出錯情況
switch op {
case "+":
return a + b, nil
case "-":
return a - b, nil
case "*":
return a * b, nil
case "/":
q, _ := div(a, b) //返回多個值 但是需要其中一個,多餘的值需要使用 _ 替代
return q, nil
default:
return 0, fmt.Errorf("沒有找到運算符號:%s", op)
}
}
//返回值可以使用名字 僅用於比較簡單的函數使用
func div(a, b int) (q, r int) {
return a / b, a % b
}
func apply(op func(int, int) int, a, b int) int {
p := reflect.ValueOf(op).Pointer()
opName := runtime.FuncForPC(p).Name()
fmt.Printf("calling function %s with args"+
"(%d, %d \n)", opName, a, b)
return op(a, b)
}
func sum(numbers ...int) int {
s := 0
for i := range numbers {
s += numbers[i]
}
return s
}
func pow(a, b int) int {
return int(math.Pow(float64(a), float64(b)))
}
func main() {
if result, err := eval(3, 4, "("); err != nil {
fmt.Println("error:", err)
} else {
fmt.Println(result)
}
q, r := div(13, 3)
fmt.Println(q, r)
fmt.Println(sum(1, 2, 3, 4, 5))
}
-
指針
package main
import "fmt"
// 引用傳遞 交換兩個數
func swap1(a, b *int) {
*b, *a = *a, *b
}
// 直接返回結果
func swap2(a, b int) (int, int) {
return b, a
}
func main() {
// go語言指針不可以運算
// go指針傳遞爲值傳遞
a, b := 3, 4
swap1(&a, &b)
fmt.Println(a, b)
a, b = swap2(a, b)
fmt.Println(a, b)
}