funcmain() { //方法一:声明一个变量,默认值是0 var a int fmt.Println("a=", a) fmt.Printf("type of a= %T\n", a) //方法二:添加一个默认值 var b int = 100 fmt.Println("b=", b) fmt.Printf("type of b= %T\n", b) //方法三,在初始化时,不添加数据类型,通过值自动匹配当前数据类型 var c = 100 fmt.Println("c=", c) fmt.Printf("type of c= %T\n", c) //方法四:(常用方法)省去var关键字,直接自动匹配
d := 200 fmt.Println("d=", d) fmt.Printf("type of d = %T\n", d) }
在声明全局变量时,我们使用上述的四种方法发现
编译直接报错
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//声明多个变量
//相同数据类型 var aa ,bb ="123","456" fmt.Printf(aa,bb) //不同数据类型 var cc ,dd=123,"123" fmt.Println(cc,dd)
//多行的多变量声明 var ( vv int =100 xx bool =true ) fmt.Println(vv,xx)
funcmain() { // 创建一个切片 slice := []int{1, 2, 3, 4, 5} slice2 := slice[1:3] for i, v := range slice2 { fmt.Printf("索引为:%d,值为:%d\n", i, v) } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
package main
import"fmt"
funcmain() { slice := []int{1, 2, 3, 4} slice2 := make([]int, len(slice)) fmt.Println("--容量为:", cap(slice2)) slice2 = slice[1:3] for i, v := range slice2 { fmt.Println("索引为:", i, "值为:", v) } fmt.Println("----------------") slice2 = append(slice2, 1) for i, v := range slice2 { fmt.Println("索引为:", i, "值为:", v) } }
// interface为万能的数据类型 funcMyFunc(arg interface{}) { fmt.Println("MyFunc is called....") fmt.Println(arg) //interface的底层该如何区分,此时引用的数据类型到底是什么 //给interface提供断言机制 value, ok := arg.(string) if !ok { fmt.Println("arg is not string type") } else { //go的value需要和 if最后一个花括号的在同一行 fmt.Println("arg type is string type,value=", value) fmt.Printf("value is %T\n", value) } }
type Book struct { auth string }
funcmain() {
book := Book{auth: "123"} MyFunc(book) MyFunc("abc") }
funcmain() { //此时book的pair键 <type:Book , value:book{}的地址> book := &Book{} //此时r的pair键< type: , value : > var r Reader //此时r的pair键 <type:Book ,value:book{}的地址> r = book r.ReadBook() //此时w的pair键<type:Book ,value : book{}的地址> w := r.(Writer) w.WriteBook()