go语言安装与开发环境
下载:https://studygolang.com/dl 选择相应的版本就好
基础语法
-
变量定义
package mainimport "fmt"// 在函数外部不可以使用:=来定义变量// 定义包内部变量
var ii = 11// 定义包内部多个变量
var bb = truess = "hello world"temp int = 123
)func variable) {// 声明变量var a int // 变量名在类型之前var b stringfmt.Printf"%d %q \n", a, b)// 赋初始值var c, e int = 1, 4var d string = "123"fmt.Printlnc, 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, falsek = true // 初始化之后可以重新赋值fmt.Printf"%d %v \n", j, k)
}func main) {// 定义变量尽量短一点,能:= 来处理就可以使用,但是:= 只可以在函数内部使用variable)fmt.Println"hello world", ii, bb, ss, temp)
}
-
内建变量类型
package mainimport "fmt""math""math/cmplx"
)func euler) {fmt.Printf"%.3f \n", cmplx.Exp1i*math.Pi)+1)
}func triangle) {var a, b int = 3, 4var c intc = intmath.Sqrtfloat64a*a + b*b)))fmt.Printlnc)
}func main) {/*1.bool2.string3.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 mainimport "fmt"func consts) {const fileNameID = "abc.txt"a, b = 3, 4)fmt.PrintlnfileNameID, a, b)
}func enums) {// const //普通枚举 可以用自增来简写// cpp = 0// java = 1// python = 2// golang = 3// )// 普通枚举类型const cpp = iotajava_ // 代表一个元素pythongolangjavascript)// 更加复杂的const表达式使用iota 来表示 b kb mb gb tb pb// 自增值枚举类型const b = 1 << 10 * iota)kbmbgbtbpb)fmt.Printlncpp, java, python, golang, javascript)fmt.Printlnb, kb, mb, gb, tb, pb)
}func main) {// 自动判断类型的变量在计算的时候才会确定类型// 声明常量 常量可以作为各种类型使用consts)// 枚举类型enums)
}
-
条件语句与循环
package mainimport "bufio""fmt""io/ioutil""os""strconv"
)func gragescore int) string {g := ""switch { // switch后面可以没有表达式case score < 0 || score > 100:panicfmt.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 converToBinn int) string {res := ""for ; n > 0; n /= 2 {lsb := n % 2res = strconv.Itoalsb) + res}return res
}func printFilefilename string) {file, err := os.Openfilename)if err != nil {panicerr)}scanner := bufio.NewScannerfile)for scanner.Scan) {fmt.Printlnscanner.Text))}
}func forever) {for {fmt.Println"abc")}
}func main) {const filename = "abc.txt"// if语句里可以赋值 但是条件里赋值的变量作用域在if中 不可以在if外使用if contents, err := ioutil.ReadFilefilename); nil != err {fmt.Printlnerr)} else {fmt.Printf"%s \n", contents)}// switchfmt.Printlngrage11))// for 整数转化为二进制表达式fmt.PrintlnconverToBin13))printFile"abc.txt")forever)}
-
函数
package mainimport "fmt""math""reflect""runtime"
)func evala, b int, op string) int, error) { //返回多个值,error用来判断出错情况switch op {case "+":return a + b, nilcase "-":return a - b, nilcase "*":return a * b, nilcase "/":q, _ := diva, b) //返回多个值 但是需要其中一个,多余的值需要使用 _ 替代return q, nildefault:return 0, fmt.Errorf"没有找到运算符号:%s", op)}
}//返回值可以使用名字 仅用于比较简单的函数使用
func diva, b int) q, r int) {return a / b, a % b
}func applyop funcint, int) int, a, b int) int {p := reflect.ValueOfop).Pointer)opName := runtime.FuncForPCp).Name)fmt.Printf"calling function %s with args"+"%d, %d \n)", opName, a, b)return opa, b)
}func sumnumbers ...int) int {s := 0for i := range numbers {s += numbers[i]}return s
}func powa, b int) int {return intmath.Powfloat64a), float64b)))
}func main) {if result, err := eval3, 4, ""); err != nil {fmt.Println"error:", err)} else {fmt.Printlnresult)}q, r := div13, 3)fmt.Printlnq, r)fmt.Printlnsum1, 2, 3, 4, 5))}
-
指针
package mainimport "fmt"// 引用传递 交换两个数
func swap1a, b *int) {*b, *a = *a, *b
}// 直接返回结果
func swap2a, b int) int, int) {return b, a
}func main) {// go语言指针不可以运算// go指针传递为值传递a, b := 3, 4swap1&a, &b)fmt.Printlna, b)a, b = swap2a, b)fmt.Printlna, b)}