入門go言語(一)

9126 ワード

1、変数と定数
1.1、変数宣言
  • 第1種は、変数タイプを指定し、初期化されていない場合、変数のデフォルトはゼロ値
  • である.
    var num int
    num = 5
    
  • 第2種は、値に基づいて変数タイプ
  • を自己判定する.
    var name = "   "
  • 第3種varを省略し、=,:=左側は新しく定義された変数でなければならない.そうしないと、
  • とエラーが発生する.
    f := 0.0043
  • 多変数宣言
  • var a,b,c = 1,2,3
    d,e,f := 4,5,6
    

    1.2、定数
    定数は、プログラムの実行時に変更されない単純な値の識別子です.
    定数のデータ型は、ブール型、数値型(整数型、浮動小数点型、複素数)、文字列型のみです.
  • 声明
  • const PI = 3.14159
  • iota

  • iota,特殊定数は,コンパイラによって修正できる定数と考えられる.
    iotaはconstキーワードが表示されると0(const内部の最初の行の前)にリセットされ、constに追加されるたびにiotaが1回カウントされます(iotaはconst文ブロック内の行インデックスとして理解できます).
    const (
    	A = iota  // iota=0	A=0
    	B         // iota=1	B=1
    	C         // iota=2	C=2
    	D = "sky" // iota=3	D="sky"
    	E         // iota=4	E="sky"
    	F = 39    // iota=5	F=39
    	G = iota  // iota=6	G=6
    	H         // iota=7	H=7
    )
    
    const (
    	J = iota // iota=0	J=0
    )
    

     
    2、プロセス構造
    2.1、if文
    package main
    
    import "fmt"
    
    func main() {
    	var num int
    	fmt.Print("    num   :")
    	fmt.Scanln(&num)
    	if num >= 5 {
    		fmt.Println("num     5.")
    	} else if num <= 0 {
    		fmt.Println("num     0.")
    	} else {
    		fmt.Println("num    0    5.")
    	}
    }
    

    2.2、switch文
    switch文は、異なる条件に基づいて異なる動作を実行するために使用され、各caseブランチは、一致するまで上から下まで1つずつテストされます.
    switch文が実行するプロセスは、上から下まで、一致するアイテムが見つかるまで、一致するアイテムの後ろにbreakを追加する必要はありません.
    switchのデフォルトではcaseは最後にbreak文を持参し、マッチングに成功した後は他のcaseは実行されません.後のcaseを実行する必要がある場合はfallthroughを使用します.
    構文:
    switch var1 {
        case val1:
            ...
        case val2:
            ...
        default:
            ...
    }
    

    2.3、forサイクル
    構文
    Go言語のForループには3つの形式があり,そのうちの1つだけがセミコロンを用いている.
    C言語のforと同様(1、initを先に実行し、2、initがcondition条件を満たしているかどうかを判断し、3、サイクルを実行し、4、postを実行し、変数に付加価値または減損を与える):
    for init; condition; post {     }

    Cのwhileと同じです.
    for condition { }

    とCのfor(;;)同じ:
    for { }
    

    EXAMPLE:
    //       
    func main() { for i := 1; i <= 9; i++ { for j := 1; j <= i; j++ { fmt.Printf("%d * %d = %d\t", j, i, i*j) } fmt.Println() } }

     
    3、配列
    配列は、データ型が同じで、長さが固定されたデータのセットを格納します.
    3.1、配列宣言
    構文:var variable_name [SIZE] variable_type
    var num_array [5]int
    

    3.2、初期化配列
    //          [size]       ,[...]         ,            
    var num_array2 = [6]int{0, 1, 2, 3, 4, 5} var string_array = [...]string{"one", "two", "three", "four", "five", "six"}

    3.3、アクセス配列要素
    構文:array_name[index]
    3.4、配列は値タイプである
    package main
    
    /*
    1、   ,     ,        
    	int,float,string,array
    2、    ,     ,        
    	slice,map
    
         :[size]type
    [6]int
    [6]int
    [6]string
    
    */
    
    import "fmt"
    
    func main() {
    	array1 := [6]int{0, 1, 2, 3, 4, 5}
    	array2 := [6]int{0, 1, 2, 3, 4, 5}
    	array3 := [...]string{"one", "two", "three", "four", "five", "six"}
    
    	//      
    	fmt.Printf("%T
    ", array1) //[6]int fmt.Printf("%T
    ", array2) //[6]int fmt.Printf("%T
    ", array3) //[6]string // array4 := array1 fmt.Println(array1) //[0 1 2 3 4 5] fmt.Println(array4) //[0 1 2 3 4 5] // array1 array4, array1[0] = 10 fmt.Println(array1) //[10 1 2 3 4 5] fmt.Println(array4) //[0 1 2 3 4 5] // fmt.Println(array1 == array2) // false array1[0] = 0 fmt.Println(array1 == array2) // true }

    3.5、スライス
    package main
    
    /*
    slice        
    
    slice       :
    1、 s1 := []int{}
    []        ,{}     ,    
    []type{}  ,          ,  int,string,map[int]string
    
    2、 s2 := make([]int, 0, 8)
          make,make            
    
    slice          
    */
    
    import "fmt"
    
    func main() {
       s1 := []int{}
       s2 := make([]int, 4, 8)
       fmt.Println(s1) // []
       fmt.Println(s2) // [0 0 0 0]
    
       //   append       slice      
       fmt.Printf("s1       :%p;          :%p
    ", &s1, s1) s1 = append(s1, 1, 2, 3, 4) fmt.Printf(" s1 :%p; :%p
    ", &s1, s1) }

      
    3.6、深浅コピー
    package main
    
    /*
    1、            ,      
    2、             ,        
    
    copy(dst, src)  :
       
    for i:=0;i 
     

     
    4、string
    4.1、stringsパッケージ
    package main
    
    import (
    	"fmt"
    	"strings"
    )
    
    func main() {
    	// string    replace   
    	str1 := "heeelloleeeworld"
    	str1 = strings.Replace(str1, "eee", "www", 1)
    	fmt.Println(str1)
    
    	//              
    	fmt.Println(strings.Contains(str1, "eee"))
    
    	//               
    	fmt.Println(strings.ContainsAny(str1, "d"))
    
    	//               
    	fmt.Println(strings.HasPrefix(str1, "heee"))
    
    	//                
    	fmt.Println(strings.HasSuffix(str1, "rld"))
    
    	//            
    	fmt.Println(strings.Split(str1, "eee"))
    }
    

    4.2、strconvパッケージ
    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	str1 := "true"
    	b1, _ := strconv.ParseBool(str1)
    	fmt.Printf("%T
    ", b1) // Atoi string int str2 := "2020" n1,_ := strconv.Atoi(str2) fmt.Printf("%T
    ", n1) // n2 := strconv.Itoa(n1) fmt.Printf("%T
    ", n2) }

      
    5、関数
    5.1、関数の宣言
    書式:
    parameters 1とparameters 2は関数形式パラメータであり、value 1とvalue 2は戻り値であり、
    func funName(parameters1 type1, parameters2 type2) (value1 type3, value2 type4) {
    	//   
    	value1 := 4
    	value2 := 9
    	return
    } 

    5.2、関数の可変パラメータ
    書式:
    args ...typeここで示す可変パラメータ
    func funcName([para type], args ...type) {
    	   
    }
    

    EXAMPLE:
    func Sum(args ...int) { //   
    	sum := 0
    	for i := 0; i < len(args); i++ {
    		sum += args[i]
    	}
    	fmt.Println(sum)
    }
    

    5.3、関数のデータ型
    関数のデータ型を印刷してみましょう
    package main
    
    import "fmt"
    
    func main() {
    	//      ,           
    	fmt.Printf("fun11         :%T
    ", fun11) // func() fmt.Printf("fun22 :%T
    ", fun22) // func(int, int, string) fmt.Printf("fun33 :%T
    ", fun33) // func([]int) (int, int) // fun44 := fun11 fun44() // fmt.Printf("fun11 :%p
    ", fun11) fmt.Printf("fun44 :%p
    ", fun44) } func fun11() { fmt.Println("this is the test!") } func fun22(n1,n2 int, s1 string) { } func fun33(s1 []int) (int, int) { return 0,0 }

    5.4、関数の本質
    関数を定義すると、メモリにメモリ領域が開き、関数名はこのメモリ領域のアドレスを指します.
    関数名は括弧を持たず、このメモリアドレスを表します.関数名は括弧で囲まれており、この関数を実行することを示します.
    5.5、コールバック
    コールバックとは、1つの関数をパラメータとして、別の関数に渡すことです.
    package main
    
    /*
      :         ,         
    */
    
    import "fmt"
    
    func main() {
    	res := opt(1, 2, add)
    	fmt.Println(res)
    }
    
    //  
    func add(a, b int) int {
    	return a + b
    }
    
    // 
    func sub(a, b int) int {
    	return a - b
    }
    
    //     
    //	              +    
    func opt(a, b int, fun func(int, int) int) int {
    	return fun(a, b)
    }
    

    5.6、閉包
    ≪クローズド・パッケージ関数|Closed Function|oem_src≫:1つの関数に宣言された関数クローズド・パッケージ:クローズド・パッケージ関数は常に外部関数の変数にアクセスし、外部関数の変数は呼び出しによって破棄されません.
    package main
    
    import "fmt"
    
    func main() {
    	zhaoyun := walk("  ")
    	zhangfei := walk("  ")
    	zhaoyun(2)
    	zhangfei(3)
    	zhangfei(1)
    	zhaoyun(2)
    }
    
    func walk(name string) func(int) {
    	total := 0
    	haha := func(hour int) {
    		total += hour
    		fmt.Printf("%s:   %d  !
    ", name, hour) fmt.Printf("%s: %d !
    ", name, total) } return haha }

      
    6、ポインタ
    ポインタ変数は、値のメモリアドレスを指します.
    *は、デポインタデータを示します
    &表示取アドレス
    定義:
    //              
    var p1 *int
    //         
    var p2 **int

     
    次の操作を行います.
    //      
    p1 = &a
    p2 = &p1
    //
    *p1
    *p2

      
    空のポインタ:
    空のポインタはnilで表します
    7、構造体
    Go言語では配列は同じタイプのデータを格納できますが、構造体では異なる項目に対して異なるデータ型を定義できます.
    構造体は、同じタイプまたは異なるタイプの一連のデータからなるデータセットである.
    定義:
    type struct_variable_type struct {
       member definition
       member definition
       ...
       member definition
    }
    

      
    example:
    package main
    
    import "fmt"
    
    type Books struct {
       title string
       author string
       subject string
       book_id int
    }
    
    
    func main() {
    
        //          
        fmt.Println(Books{"Go   ", "www.runoob.com", "Go     ", 6495407})
    
        //       key => value   
        fmt.Println(Books{title: "Go   ", author: "www.runoob.com", subject: "Go     ", book_id: 6495407})
    
        //        0    
       fmt.Println(Books{title: "Go   ", author: "www.runoob.com"})
    }
    

      
    構造体メンバーへのアクセス:
    構造体メンバーにアクセスするには、ポイント番号が必要です.オペレータ
       .