入門go言語(一)
9126 ワード
1、変数と定数
1.1、変数宣言第1種は、変数タイプを指定し、初期化されていない場合、変数のデフォルトはゼロ値 である.第2種は、値に基づいて変数タイプ を自己判定する.第3種varを省略し、=,:=左側は新しく定義された変数でなければならない.そうしないと、 とエラーが発生する.多変数宣言
1.2、定数
定数は、プログラムの実行時に変更されない単純な値の識別子です.
定数のデータ型は、ブール型、数値型(整数型、浮動小数点型、複素数)、文字列型のみです.声明 iota
iota,特殊定数は,コンパイラによって修正できる定数と考えられる.
iotaはconstキーワードが表示されると0(const内部の最初の行の前)にリセットされ、constに追加されるたびにiotaが1回カウントされます(iotaはconst文ブロック内の行インデックスとして理解できます).
2、プロセス構造
2.1、if文
2.2、switch文
switch文は、異なる条件に基づいて異なる動作を実行するために使用され、各caseブランチは、一致するまで上から下まで1つずつテストされます.
switch文が実行するプロセスは、上から下まで、一致するアイテムが見つかるまで、一致するアイテムの後ろにbreakを追加する必要はありません.
switchのデフォルトではcaseは最後にbreak文を持参し、マッチングに成功した後は他のcaseは実行されません.後のcaseを実行する必要がある場合はfallthroughを使用します.
構文:
2.3、forサイクル
構文
Go言語のForループには3つの形式があり,そのうちの1つだけがセミコロンを用いている.
C言語のforと同様(1、initを先に実行し、2、initがcondition条件を満たしているかどうかを判断し、3、サイクルを実行し、4、postを実行し、変数に付加価値または減損を与える):
Cのwhileと同じです.
とCのfor(;;)同じ:
EXAMPLE:
3、配列
配列は、データ型が同じで、長さが固定されたデータのセットを格納します.
3.1、配列宣言
構文:var variable_name [SIZE] variable_type
3.2、初期化配列
3.3、アクセス配列要素
構文:array_name[index]
3.4、配列は値タイプである
3.5、スライス
3.6、深浅コピー
4、string
4.1、stringsパッケージ
4.2、strconvパッケージ
5、関数
5.1、関数の宣言
書式:
parameters 1とparameters 2は関数形式パラメータであり、value 1とvalue 2は戻り値であり、
5.2、関数の可変パラメータ
書式:
args ...typeここで示す可変パラメータ
EXAMPLE:
5.3、関数のデータ型
関数のデータ型を印刷してみましょう
5.4、関数の本質
関数を定義すると、メモリにメモリ領域が開き、関数名はこのメモリ領域のアドレスを指します.
関数名は括弧を持たず、このメモリアドレスを表します.関数名は括弧で囲まれており、この関数を実行することを示します.
5.5、コールバック
コールバックとは、1つの関数をパラメータとして、別の関数に渡すことです.
5.6、閉包
≪クローズド・パッケージ関数|Closed Function|oem_src≫:1つの関数に宣言された関数クローズド・パッケージ:クローズド・パッケージ関数は常に外部関数の変数にアクセスし、外部関数の変数は呼び出しによって破棄されません.
6、ポインタ
ポインタ変数は、値のメモリアドレスを指します.
*は、デポインタデータを示します
&表示取アドレス
定義:
次の操作を行います.
空のポインタ:
空のポインタはnilで表します
7、構造体
Go言語では配列は同じタイプのデータを格納できますが、構造体では異なる項目に対して異なるデータ型を定義できます.
構造体は、同じタイプまたは異なるタイプの一連のデータからなるデータセットである.
定義:
example:
構造体メンバーへのアクセス:
構造体メンバーにアクセスするには、ポイント番号が必要です.オペレータ
1.1、変数宣言
var num int
num = 5
var name = " "
f := 0.0043
var a,b,c = 1,2,3
d,e,f := 4,5,6
1.2、定数
定数は、プログラムの実行時に変更されない単純な値の識別子です.
定数のデータ型は、ブール型、数値型(整数型、浮動小数点型、複素数)、文字列型のみです.
const PI = 3.14159
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"})
}
構造体メンバーへのアクセス:
構造体メンバーにアクセスするには、ポイント番号が必要です.オペレータ
.