package main // 声明文件的package名import"fmt"// import语言的fmt库-- 用于输出funcmain(){
fmt.Println("Hello, World! %s","33")}/*
运行代码方式
1.直接运行
go run demo1.go //编译成二进制文件 并运行
2.编译二进制 在运行
go build demo1.go
./demo1
第一行代码定义了包名。
下一行是引入的包
包一般4种类型 系统自带的库, 内部私有库 外部库 本地库
main 是程序执行的入口,如果有init先执行
*/
2. 变量声明
package main
import"fmt"funcmain(){// 声明初始化一个变量var x int=100var str string="hello world"// 声明初始化多个变量var i, j, k int=1,2,3// 不指定类型,通过初始化推导var b =true// bool 类型const LENGTH int=10// 常量
fmt.Println(x, str, i, j, k, b, LENGTH)abc()}funcabc(){var v21 int32// 初始化为0var v22 int=2var v23 =3
v24 :=3
v21 =int32(v23)// 强制转换
g, h :="cc","hello"// 只能在函数体中提现
g,h = h,g
fmt.Println(g,h)
fmt.Println("v21 is", v21)
fmt.Println("v22 is", v22)
fmt.Println("v23 is", v23)
fmt.Println("v24 is", v24)
fmt.Println(g, h)}
3. 数组声明
package main
import"fmt"funcmain(){var a [5]int
fmt.Println("array a:", a)
a[1]=10
a[1]=30
fmt.Println("assign:", a)
fmt.Println("len:",len(a),"cap:",cap(a))
b :=[5]int{1,2,3,4,5}
fmt.Println("b array init:", b)for k, v :=range b {
fmt.Println("key:", k,"value:", v)}for v :=range b {// _ 下划线用于忽略值不接收不处理
fmt.Println("value:", v)}var c [2][3]intfor i :=0; i <2; i++{for j :=0; j <3; j++{
c[i][j]= i + j
}}
fmt.Println("2d:", c)}
4. 多返回值
package main
import"fmt"funcmain(){
v, e :=multiReturn("one")
fmt.Println(v, e)// 输出 1 true
v, e =multiReturn("four")
fmt.Println(v, e)// 输出 0 false// 通常的用法(注意分号后有e)if_, e =multiReturn("four"); e {// 正常返回}else{// 出错返回
fmt.Println("no four.")}}funcmultiReturn(key string)(val int, err bool){
m :=map[string]int{"one":1,"two":2,"three":3}
val, err = m[key]//k := map[int]interface{}return}
5. 结构体
package main
import"fmt"// Person 定义一个人属性的结构体type Person struct{
name string
age int
email string}funcmain(){// 初始化
person := Person{"Tom",30,"tom@gmail.com"}
fmt.Println(person)// 输出 {Tom 30 tom@gmail.com}var person2 = Person{name:"jan", age:24, email:"jan@gmail.com"}
fmt.Println(person2)
pPerson :=&person
fmt.Println(pPerson)// 输出 &{Tom 30 tom@gmail.com}
pPerson.age =40
person.name ="Jerry"
fmt.Println(person)// 输出 {Jerry 40 tom@gmail.com}}
6. 接口方法
package main
import"fmt"type rect struct{
width, height int}func(r *rect)area()int{// 求面积return r.width * r.height
}func(r *rect)perimeter()int{// 求周长return2*(r.width + r.height)}// 注意:Go语言中没有public, protected, private的关键字,所以,如果你想让一个方法可以被别的包访问的话,// 你需要把这个方法的第一个字母大写。这是一种约定。funcmain(){
r := rect{width:10, height:15}
fmt.Println("面积: ", r.area())
fmt.Println("周长: ", r.perimeter())
rp :=&r
fmt.Println("面积: ", rp.area())
fmt.Println("周长: ", rp.perimeter())}
package main
import("fmt""log""net/http")funcmain(){// http请求处理
http.HandleFunc("/test", test)
fmt.Print("http server start.....")// 绑定监听地址和端口
log.Fatal(http.ListenAndServe("127.0.0.1:8080",nil))}functest(w http.ResponseWriter, r *http.Request){
fmt.Fprintln(w,"hello world")}
9. 并行处理
package main
import("fmt""runtime""sync")// 并发funcmain(){
runtime.GOMAXPROCS(1)var wg sync.WaitGroup
wg.Add(2)
fmt.Println("Start Goroutines")gofunc(){// Schedule the call to Done to tell main we are done.defer wg.Done()// Display the alphabet three timesfor count :=0; count <3; count++{for char :='a'; char <'a'+26; char++{
fmt.Printf("%c ", char)}
fmt.Println()}}()// Declare an anonymous function and create a goroutine.gofunc(){// Schedule the call to Done to tell main we are done.defer wg.Done()// Display the alphabet three timesfor count :=0; count <3; count++{for char :='A'; char <'A'+26; char++{
fmt.Printf("%c ", char)}
fmt.Println()}}()// Wait for the goroutines to finish.
fmt.Println("Waiting To Finish")
wg.Wait()
fmt.Println("\nTerminating Program")}